在块中的无 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。如果您调用 alloc
、copy
或 retain
,您拥有该对象并且您必须调用 release
- 除非您明确将所有权转让给其他人(这不是太常见了)。
此处块的使用无关紧要。
这是完整的引用计数:
- 您调用
alloc/init
- 引用计数为 1。
- 您调用
setMyObj:
- 引用计数为 2(因为 属性 被保留)。
- 您调用
aLocalObj release
- 引用计数为 1。
- 在
dealloc
中调用 _myObj release
- 引用计数为 0。
顺便说一句 - 这就是您应该使用 ARC 的原因。无需担心这些细节。
我不确定我是否完全理解如何使用释放和保留。 例如: 在这种情况下
@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。如果您调用 alloc
、copy
或 retain
,您拥有该对象并且您必须调用 release
- 除非您明确将所有权转让给其他人(这不是太常见了)。
此处块的使用无关紧要。
这是完整的引用计数:
- 您调用
alloc/init
- 引用计数为 1。 - 您调用
setMyObj:
- 引用计数为 2(因为 属性 被保留)。 - 您调用
aLocalObj release
- 引用计数为 1。 - 在
dealloc
中调用_myObj release
- 引用计数为 0。
顺便说一句 - 这就是您应该使用 ARC 的原因。无需担心这些细节。