我将大约2006年的一些旧的ObjC代码导入最新的Xcode。它是在ARC时代之前写的,我对以前的系统没有很强的把握。寻找关于如何诊断这些的一些建议。
这是一个例子,数百个......
sym = [ globals addObject:[ [ NCObject alloc ] initWithArray:saved dimension:dimension type:type ] ] ;
错误并不具体,我是否需要围绕整个事情自动发布,或者在"类型]&#34之后立即自动发布?
我似乎记得,基本规则是,如果我看到一个inti,我需要自动释放它。还有其他需要考虑的案例吗?
答案 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)
alloc...
(任何以alloc
开头的方法),new
,copy...
,mutableCopy...
会为您提供保留的对象(感谢@jlehr扩展了原始清单)。globals
保留
您创建的NCObject
。 release
或autorelease
撰写。如果你release
一个对象,你不能再使用它,因为如果它
retainCount
已达到零,它将立即解除分配。一个
自动释放的对象将一直存在,直到最近的autoreleasepool
漏。在您编写的示例中,您必须平衡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。它很短。它描述了您需要的所有规则。