【发布时间】:2015-05-25 16:53:10
【问题描述】:
我想知道如何发布强大的属性/iVar。我想澄清为什么我打算这样做。我通过以下任何一种声明拥有一个对象:
@interface MyClass : NSObject
@property (readwrite, nonatomic) MyObject *hugeObject;
@end
或
@interface MyClass : NSObject {
MyObject *hugeObject;
}
@end
我用某种方法创建这个对象,我用另一种方法等等
- (void)someMethod {
hugeObject = [[MyObject alloc] init];
}
- (void)someOtherMethod {
hugeObject = //some function call which returns a MyObject object
//do something with hugeObject
}
现在,someOtherMethod 被多次调用,每次hugeObject 都必须存储一个新值。我不再需要以前的值,因为它很重,我想摆脱它。于是我就这样修改了someOtherMethod
- (void)someOtherMethod {
hugeObject = //some function call which returns a MyObject object
//do something with hugeObject
hugeObject = nil;
}
我不想等到dealloc,所以将它分配给nil。但是内存使用量还是会上升,只有在程序结束时才会下降。
所以,这就是我的困惑:
- 分配给强属性的内存是否会在属性设置为 nil 时立即释放?
- 还是只有ARC自己调用dealloc才释放内存?
问题识别:指向对象的强引用。
解决方案:
我通过将所有strong 属性/iVar 放在@autoreleasepool 中来解决它(如已接受的答案中所建议的那样),以便它们在当前运行循环结束时被释放。调试很有帮助(如 Sulthan 所建议的那样)。
注意:确保@autoreleasepool 是一个本地范围的池,否则这会阻止您期望的内存释放——因为仍然会有一个强引用。
经验教训:
- 分配
nil后,您只能确定一件事。该对象将收到release或autorelease消息。 ARC 不保证是哪一个。 - 如果不再有指向对象的强引用,内存将立即释放(
release情况)或在当前循环结束时(autorelease情况)。
【问题讨论】:
-
这个问题有点含糊,因为您说的是“属性”,但您在示例中没有使用任何 Objective-C 属性。
-
ARC 会在你
nil指向它的强指针时向对象发送release消息,但如果其他东西有指向同一个对象的强指针,那么该对象将不会尚未释放。 -
@PhillipMills 这是一个愚蠢的错误。请检查修改后的版本
-
@JoshCaswell 当遇到
nil时,ARC 会立即发送release消息,还是会等待范围完成? ARC也会将release发送到hugeObject,对吗?如果是这样,那么在分配nil之前它指向的内存块会发生什么情况?
标签: objective-c memory-management automatic-ref-counting