我发现以下代码泄漏!为什么我有这个问题?是因为它复制了NSString中的属性。有办法解决这个问题吗?
@property (nonatomic, copy) NSString *reg;
@property (nonatomic, copy) NSString *reg2;
@property (nonatomic, copy) NSNumber *altitude;
@property (nonatomic, copy) NSNumber *heading;
-(void)updateTitles{
self.title=[NSString stringWithFormat:@"%@ %@",self.reg,self.reg2];
self.subtitle = [NSString stringWithFormat:@"%@ft %@°",self.altitude,self.heading];
}
此方法中每个属性设置的泄漏率为50%。
更新
原来这是从一个区块调用的。为了解决这个问题,我做了以下几点。
以下工作但仍然泄漏,现在明确保留自我。
-(void)updateTitles{
__block NSString *thisTitle = [[NSString alloc] initWithFormat:@"%@ %@",self.reg1,self.reg2];
__block NSString *subTitle = [[NSString alloc] initWithFormat:@"%@ft %@°",self.altitude,self.heading];
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue,^(){
self.title=thisTitle;
self.subtitle = subTitle;
[thisTitle release];
[subTitle release];
});
}
然而,泄漏以及理论上应该使用的以下内容在setTitle方法上给出了一个无法识别的选择器!!!!!
-(void)updateTitles{
__block NSString *thisTitle = [[NSString alloc] initWithFormat:@"%@ %@",self.reg1,self.reg2];
__block NSString *subTitle = [[NSString alloc] initWithFormat:@"%@ft %@°",self.altitude,self.heading];
__block __typeof__(self) blockSelf = self;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue,^(){
[blockSelf setTitle:thisTitle];
[blockSelf setSubtitle:subTitle];
[thisTitle release];
[subTitle release];
});
}
答案 0 :(得分:1)
假设您没有使用ARC,具有上述属性的对象是否具有dealloc
方法,并且是否正确释放了ivars?该对象本身是由保留它的任何对象释放的吗?
覆盖getter而不是设置标题/副标题会有所不同:
-(NSString *) title
{
return [NSString stringWithFormat:@"%@ %@",self.reg,self.reg2];
}
等