泄漏物体,我需要修复它

时间:2015-08-28 21:19:34

标签: objective-c autorelease

我将大约2006年的一些旧的ObjC代码导入最新的Xcode。它是在ARC时代之前写的,我对以前的系统没有很强的把握。寻找关于如何诊断这些的一些建议。

这是一个例子,数百个......

sym = [ globals addObject:[ [ NCObject alloc ] initWithArray:saved dimension:dimension type:type ] ] ;

错误并不具体,我是否需要围绕整个事情自动发布,或者在"类型]&#34之后立即自动发布?

我似乎记得,基本规则是,如果我看到一个inti,我需要自动释放它。还有其他需要考虑的案例吗?

2 个答案:

答案 0 :(得分:2)

是。自动释放是对的。 alloc创建一个rc = + 1对象。将它添加到数组使其为+2。 Autorelease将它保留在+1,这是你想要的地方。释放globals数组最终会将其恢复为0,这也是所希望的行为。

为清楚起见:

sym = [[NCObject alloc] initWithArray:saved dimension:dimension type:type];
[globals addObject:sym];
[sym autorelease];

请注意release在这种情况下也同样出色(稍好一点,因为它不会让任何自动释放池工作以供日后使用)。除非函数返回sym,否则可以释放。

答案 1 :(得分:1)

  1. alloc...(任何以alloc开头的方法),newcopy...mutableCopy...会为您提供保留的对象(感谢@jlehr扩展了原始清单)。
  2. 收藏保留 它们中包含的对象(在您的情况下,globals保留 您创建的NCObject
  3. 您应平衡每次保留 您使用releaseautorelease撰写。如果你release一个对象,你不能再使用它,因为如果它 retainCount已达到零,它将立即解除分配。一个 自动释放的对象将一直存在,直到最近的autoreleasepool 漏。
  4. 在您编写的示例中,您必须平衡alloc,因此在将release NCObject添加到阵列后,您必须release(如果您autorelease之前,它很可能会被取消分配),或let parameters = ["foo": "bar"] Alamofire.request(.POST, "url", parameters: parameters) .responseJSON { request, response, json, error in print("request: \(request)") } 随时随地。

    但我真的建议你阅读Apple的Advanced Memory Management Programming Guide。它很短。它描述了您需要的所有规则。