有人能指出我在这段代码中泄漏了吗?

时间:2011-01-17 04:34:06

标签: objective-c memory-leaks

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对象。

有什么建议吗?

由于

1 个答案:

答案 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]; 时,除非您明确释放它,否则该复制的对象将被泄露。