DisplayMap.h
#import <Foundation/Foundation.h>
#import <MapKit/MKAnnotation.h>
@interface DisplayMap : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subtitle;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@end
DisplayMap.m
#import "DisplayMap.h"
@implementation DisplayMap
@synthesize coordinate,title,subtitle;
-(void)dealloc{
[title release];
[super dealloc];
}
@end
我在地图视图中实现上述内容以显示注释。在viewdidload上,我运行一组坐标并使用上面提到的注释类在地图上显示它们。
for(int i=0;i<[xmlParameter count];i++){
region.center.latitude=(double)[[[xmlParameter objectAtIndex:i]objectAtIndex:3] doubleValue];
region.center.longitude =(double) [[[xmlParameter objectAtIndex:i]objectAtIndex:4] doubleValue] ;
region.span.longitudeDelta = 0.08f;
region.span.latitudeDelta = 0.08f;
DisplayMap *ann = [[DisplayMap alloc] init];
ann.title = [[xmlParameter objectAtIndex:i]objectAtIndex:0];
ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1];
ann.coordinate = region.center;
[mapView addAnnotation:ann];
if(i==zoomtoParameter){
[mapView setRegion:region animated:YES];
//showAnnotation=ann;
[mapView selectAnnotation:currentAnnotation animated:YES];
//[mapView selectAnnotation:ann animated:YES];
}
[ann release];
}
使用泄漏仪器运行,表示viewDidLoad方法中有32Bytes的DisplayMap泄漏。我无法弄清楚如何;我在完成后立即发布了DisplayMap对象。
有什么建议吗?
由于
答案 0 :(得分:4)
您的subtitle
属性声明为copy
属性,这意味着您有责任释放它。对dealloc
方法进行以下更改应该可以解决问题:
-(void)dealloc{
[subtitle release];
[title release];
[super dealloc];
}
编辑: 详细说明:Cocoa的memory management规则规定您必须release
任何内存alloc
,{{ 1}}或retain
。对于合成属性,这意味着您必须在copy
方法中包含相应的release
消息。有关详细信息,请参阅我自己的question。
在您提供的示例代码中,包含以下行:
-dealloc
创建指定对象的副本。当您稍后调用ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1];
时,除非您明确释放它,否则该复制的对象将被泄露。