在一个区块中释放并保留在无ARC的情况下

时间:2015-09-08 14:11:35

标签: objective-c reference-counting

我不确定我是否完全理解如何使用发布和保留。 例如: 在这种情况下

@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?

这是对的吗?

2 个答案:

答案 0 :(得分:2)

您必须释放该对象,因为设置保留属性会增加保留计数器。

工作流:

// -> retainCount = 0  
[[MyObj alloc] init];      // -> retainCount = 1
[self setMyObj:aLocalObj]; // -> retainCount = 2
[aLocalObj release];       // -> retainCount = 1

将属性设置为nil会将计数器设置为零并取消分配对象

答案 1 :(得分:2)

是的,您需要致电发布。如果您致电alloccopyretain,则您拥有该对象,并且必须致电release - 除非您明确将所有权转让给其他人(不是'太常见了。

此处使用区块无关紧要。

这是完整的参考计数:

  1. 您致电alloc/init - 参考人数为1。
  2. 您致电setMyObj: - 参考人数为2(因为保留了该属性)。
  3. 您致电aLocalObj release - 参考人数为1。
  4. dealloc中,您拨打_myObj release - 引用计数为0。
  5. BTW - 这就是你应该使用ARC的原因。无需担心任何这些细节。