2013-05-27 54 views
4

嗨我正在处理内存泄漏,但我不知道它是什么问题(我没有太多的仪器经验,所以请原谅,如果我问一些明显的问题) 。NSString stringwithwith内存泄漏与ARC

基本上我有两个字符串作为在我的类属性,第一个将要显示给用户的主队列被检索,并且不立即需要在背景队列中检索到的一个:

在stringWithFormat code leak enter image description here

问题与占位符做@“%@ ...”,因为如果我只是把@‘测试’:

@property (nonatomic, strong) NSString *stringDefaultLocationAddress; 
@property (nonatomic, strong) NSString *stringCurrentLocationAddress; 

-(void)viewDidLoad{ 
    ... 
      dispatch_async(idQueue, ^(void) { 
      [self recuperaDireccionActualEnBackground:currentUserLocation.coordinate]; 
     }); 

} 

- (void)dealloc{ 
    [self removeObserver:self forKeyPath:@"playerProfileNeedsUpdate"]; 
    self.stringCurrentLocationAddress = nil; 
    self.stringDefaultLocationAddress = nil; 
} 

但我得到这个泄漏的仪器那时泄漏消失了,但我不知道为什么泄漏这一点,我想了解它。

在此先感谢。

+2

如果你只是放了'@“Test”''''''''''''''''''''''''''''''消息' - [NSString copy]'当它是可变的('NSMutableString'的子类)时产生一个副本,或者当它是不可变的时候保留('NSString'的子类)。因此,在声明'NSString'时总是复制。复制可变字符串可确保客户端不会远程更改保存在属性中的值。如果您使用的是iOS 5,则“CLGeocoder”中有地理编码和反向地理编码,您不需要库。你不需要在'dealloc'中删除变量,ARC已经释放了这些属性。 – Jano

+0

我感谢你@Jano的回复,我刚刚添加了COPY消息,现在我没有内存泄漏,谢谢你的回应。 – Rubs

+0

我的意思是声明:@property(nonatomic,COPY)NSString * stringDefaultLocationAddress; – Rubs

回答

3

仪器会告诉您泄漏物体的分配位置,但这可能不是泄漏的位置。您需要查看对象的保留和释放历史记录(单击地址旁边的圆圈中的右箭头)。您必须手动分析每个保留,将每个保留与逻辑对应的发布相关联,直到找到不平衡的保留。

如果您在整个代码中使用ARC,我怀疑您错用了__bridge_retainedCFBridgingRetain()。或者也许你已经做了一个适当的桥梁投掷到CFStringRef,但之后没有正确做手动引用计数。

绝对用静态分析器构建,并努力消除所引起的所有问题(或者至少向自己证实它们是误报)。