在块中的无 ARC 情况下释放和保留

Release and Retain in No-ARC case in a block

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

@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 的引用计数将为 1 ?

对吗?

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

工作流程:

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

将 属性 设置为 nil 会将计数器设置为零并释放对象

是的,你需要调用release。如果您调用 alloccopyretain,您拥有该对象并且您必须调用 release - 除非您明确将所有权转让给其他人(这不是太常见了)。

此处块的使用无关紧要。

这是完整的引用计数:

  1. 您调用 alloc/init - 引用计数为 1。
  2. 您调用 setMyObj: - 引用计数为 2(因为 属性 被保留)。
  3. 您调用 aLocalObj release - 引用计数为 1。
  4. dealloc 中调用 _myObj release - 引用计数为 0。

顺便说一句 - 这就是您应该使用 ARC 的原因。无需担心这些细节。