首页 文章

删除MKMapView注释会导致泄漏

提问于
浏览
1

我已经开发了一组非常复杂的Web服务,并搜索下面简单的代码 . 我需要能够在 Map 中添加注释以响应搜索(或在下面的示例中点击按钮),然后允许用户再次单击该按钮并获得一组新结果 . 实际上会有不同的数字,但在简化的示例中,我们总是在mapview中添加一个注释 . 我相信我的代码应该删除现有的注释并添加一个新注释,但它在第二次和后续按钮推送时泄漏32个字节 . 我错过了什么? (或保留视情况而定!)

testViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "MyMark.h"

@interface testViewController : UIViewController  {
    MKMapView *mapView;
}

@end

testViewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
        self.title=@"test";
    }
    return self;
}

- (void) storeLocationInfo: (CLLocationCoordinate2D) loc title:(NSString *)t subtitle:(NSString *)st index:(int)i {
    NSArray * annotations = [mapView annotations];
    [mapView removeAnnotations:annotations];

    MyMark * mymark=[[MyMark alloc] initWithCoordinate:loc];
    [mapView addAnnotation:mymark];
    [MyMark release];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithTitle:@"Add point to map" style:UIBarButtonItemStylePlain target:self action:@selector(addPushed)];
    [self.navigationItem setRightBarButtonItem:barButton];
    [barButton release];

    mapView=[[MKMapView alloc] initWithFrame:CGRectMake(0.0,0.0,self.view.frame.size.width,self.view.frame.size.height)];
    mapView.showsUserLocation=FALSE;
    mapView.delegate=self;
    [self.view insertSubview:mapView atIndex:0];
    [mapView release];
}

- (void) addPushed {
    MKCoordinateRegion reg = mapView.region;
    [self storeLocationInfo:reg.center title:@"price" subtitle:@"title" index:1];
}

- (void)dealloc {
    [super dealloc];
}

MyMark.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>


@interface MyMark : NSObject<MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString * title;
    NSString * subtitle;
    int index;
}
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly) int index;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * subtitle;
-(id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
-(id)setCoordinate:(CLLocationCoordinate2D) coordinate;
-(id)setTitle:(NSString *)t subtitle:(NSString *)st index:(int)i ;

@end

MyMark.m

#import "MyMark.h"


@implementation MyMark
@synthesize coordinate, index;
@synthesize title,subtitle;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c{
    coordinate=c;
    NSLog(@"%f,%f",c.latitude,c.longitude);
    return self;
}

-(id)setCoordinate:(CLLocationCoordinate2D) c{
    coordinate=c;
    NSLog(@"%f,%f",c.latitude,c.longitude);
    return self;
}

-(id)setTitle:(NSString *)t subtitle:(NSString *)st index:(int) i{
    self.title=t;
    self.subtitle=st;
    index=i;
    return self;
}

-(void) dealloc {
    [title release];
    [subtitle release];
    [super dealloc];
}

1 回答

  • 4

    你没有在 storeLocationInfo:title:subtitle:index: 中发布 mymark . 看起来问题是打字错误 . 读取的行

    [MyMark release];
    

    应该

    [mymark release];
    

    注意案例差异 . 第一行将 release 发送给类,而不是实例 .

相关问题