Objective c 有人能告诉我这个密码有漏洞吗?
DisplayMap.hObjective 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
#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]我会处理好标题和副标题。它不仅解决了问题,而且我确实学到了一些东西。再次感谢