【问题标题】:NSString stringwithFormat memory leak with ARC使用 ARC 的 NSString stringwithFormat 内存泄漏
【发布时间】:2013-05-22 13:53:15
【问题描述】:

您好,我正在处理内存泄漏,但我无法弄清楚它是什么问题(我对仪器没有太多经验,所以如果我问的问题很明显,请见谅)。

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

@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;
}

但我在仪器中发现了这种泄漏:

问题与 stringWithFormat 中的占位符 @" %@..." 有关,因为如果我只是将 @"Test" 放在那一点,泄漏就消失了,但我不知道为什么会泄漏这个和我想了解一下。

提前致谢。

【问题讨论】:

  • 如果您只输入@"Test",您将创建一个不会泄漏的编译时间常数。当消息-[NSString copy] 是可变的(NSMutableString 的子类)或不可变时(NSString 的子类)时,它会生成一个副本。因此,在声明NSString 时始终复制。复制可变字符串可确保客户端不会远程更改您保存在属性上的值。如果您使用的是 iOS 5,您在CLGeocoder 中有地理编码和反向地理编码,则不需要库。 dealloc 中的变量不需要置零,ARC 已经发布了属性。
  • 感谢@Jano 的回复,我刚刚在该行添加了 COPY 消息,现在我没有内存泄漏,感谢您的友好回复。
  • 我的意思是声明:@property (nonatomic, COPY) NSString *stringDefaultLocationAddress;

标签: objective-c memory-leaks


【解决方案1】:

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

如果您在整个代码中使用 ARC,我怀疑您误用了 __bridge_retainedCFBridgingRetain()。或者,您可能已经对CFStringRef 进行了适当的桥接,但之后未能正确地进行手动引用计数。

绝对使用静态分析器构建并努力消除它引发的所有问题(或至少向自己确认它们是误报)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 2015-06-20
    • 2016-02-04
    • 2012-04-03
    • 2012-09-14
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多