Objective c 有人能告诉我这个密码有漏洞吗?

Objective c 有人能告诉我这个密码有漏洞吗?,objective-c,memory-leaks,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 (n

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
我在地图视图中实现上述功能以显示注释。在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];
}   

for(int i=0;i您的
subtitle
属性是用
copy
属性声明的,这意味着您有责任释放它。对
dealloc
方法的以下更改应该可以实现此目的:

-(void)dealloc{
    [subtitle release];
    [title release];
    [super dealloc];
}
编辑:详细说明:Cocoa的规则规定,您必须
释放
所有您
alloc
保留
复制的内存。对于合成属性,这意味着您必须在
-dealoc
方法中包含适当的
释放
消息。请参见我自己的有关详细信息,请参阅本主题

在您提供的示例代码中,显示以下行:

ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1];

创建指定对象的副本。稍后调用
[ann release]
,复制的对象将被泄漏,除非您明确释放它。

您的
subtitle
属性使用
copy
属性声明,这意味着您有责任释放它。对
dealloc
方法的以下更改应该可以做到这一点:

-(void)dealloc{
    [subtitle release];
    [title release];
    [super dealloc];
}
编辑:详细说明:Cocoa的规则规定,您必须
释放
所有您
alloc
保留
复制的内存。对于合成属性,这意味着您必须在
-dealoc
方法中包含适当的
释放
消息。请参见我自己的有关详细信息,请参阅本主题

在您提供的示例代码中,显示以下行:

ann.subtitle = [[xmlParameter objectAtIndex:i]objectAtIndex:1];

创建指定对象的副本。稍后调用
[ann release]
,复制的对象将泄漏,除非您明确释放它。

尝试在您的
dealoc
中也释放
subtitle
。您释放了标题,但在哪里分配了它?尝试在
dealoc
中也释放
subtitle
。您释放了标题,但在哪里分配了它?不是
[ann release];
负责解除分配其所有成员变量?eJames是对的。我想当你错过[super dealloc];,你会得到一个警告。当你得到警告时,解决它:)@Mahesh:The
-dealloc
方法负责释放任何分配、保留或复制(但尚未发布)的成员变量在该对象生命周期的任何时刻。@Mahesh:澄清一下:在您的示例中,
[ann release]
将释放
ann
对象的内存,但
ann
包含指针(副标题)指向
NSString
对象。指针的内存将被释放,但它指向的
NSString
对象的内存将不会被释放。谢谢ejames,这就成功了。我的头撞到了这个上面。我想[ann release]将负责标题和副标题。它不仅解决了问题,而且我确实学到了一些东西。再次感谢您不是
[ann release];
负责解除其所有成员变量的分配吗?eJames是对的。我想您错过[super dealoc]时会收到警告;当您收到警告时,解决它:)@Mahesh:The
-dealloc
方法负责释放在该对象生命周期的任何时候分配、保留或复制(但尚未释放)的任何成员变量。@Mahesh:to澄清:在您的示例中
[ann release]
将释放
ann
对象的内存,但
ann
包含指针(副标题)指向
NSString
对象。指针的内存将被释放,但它指向的
NSString
对象的内存将不会被释放。谢谢ejames,这就成功了。我的头撞到了这个上面。我想[ann release]我会处理好标题和副标题。它不仅解决了问题,而且我确实学到了一些东西。再次感谢