我不确定我是否完全理解如何使用发布和保留。 例如: 在这种情况下
@interface MyClass :NSObject
@property (nonatomic, retain) MyObj* myObj;
@end
@implementation MyClass
@synthesize myObj = _myObj;
- (void)aFunction
{
void(^myBlock)(void) =
^{
MyObj* aLocalObj = [[MyObj alloc] init];
[self setMyObj:aLocalObj];
[aLocalObj release];// Question here: I wonder if we need to relesae block local variable aLocalString in No-ARC case?
};
dispatch_async(dispatch_get_main_queue(), ^{myBlock();});
}
@end
我想知道我们是否需要发布" aLocalObj"在街区?
在我看来,不需要[aLocalObj release],因为在[self setMyObj:aLocalObj]中;它将内存传递给myObj属性。并且myObj属性接管已分配的内存,而_myObj将具有ref count 1?
这是对的吗?
答案 0 :(得分:2)
您必须释放该对象,因为设置保留属性会增加保留计数器。
工作流:
// -> retainCount = 0
[[MyObj alloc] init]; // -> retainCount = 1
[self setMyObj:aLocalObj]; // -> retainCount = 2
[aLocalObj release]; // -> retainCount = 1
将属性设置为nil
会将计数器设置为零并取消分配对象
答案 1 :(得分:2)
是的,您需要致电发布。如果您致电alloc
,copy
或retain
,则您拥有该对象,并且必须致电release
- 除非您明确将所有权转让给其他人(不是'太常见了。
此处使用区块无关紧要。
这是完整的参考计数:
alloc/init
- 参考人数为1。setMyObj:
- 参考人数为2(因为保留了该属性)。aLocalObj release
- 参考人数为1。dealloc
中,您拨打_myObj release
- 引用计数为0。