这两种方法有什么区别吗?
```
// MACRO FUNCTION
#define SAFELY_RELEASE(__POINTER) { [__POINTER release]; __POINTER = nil; }
// C FUNCTION
void SAFELY_RELEASE(id __POINTER) {
[__POINTER release]; __POINTER = nil;
}
```
答案 0 :(得分:2)
是。该函数不会按照您的预期执行,因为指针将通过值而不是通过引用传递给它。
想象一下:
- (void)method {
id object = [[NSObject alloc] init];
SAFELY_RELEASE( object );
}
SAFELY_RELEASE获得object
。它可以向其发送消息,但将其设置为nil不会更改method
中的值。
等效函数是:
void SAFELY_RELEASE(id *__POINTER) {
[*__POINTER release]; *__POINTER = nil;
}
然后你可以使用它来使用它:
SAFELY_RELEASE( &object );
宏还有另一个缺点:Xcode的重构工具可能无法更改内部参数。例如:
@interface Foo {
NSObject *var;
}
@implementation Foo
- (id)init {
if (( self = [super init] )) {
var = [[NSObject alloc] init];
}
return self;
}
- (void)dealloc {
SAFELY_RELEASE(var);
[super dealloc];
}
如果您尝试使用重构工具重命名var,您可能会发现它无法在dealloc中重命名var。
真的,除非你有充分的理由这样做,否则你应该使用ARC。
答案 1 :(得分:0)
void SAFELY_RELEASE(id __POINTER)
保证POINTER是一个可释放的对象。
它们都是错误的,因为__POINTER = nil;
没有效果。你应该把它放在对象(控制器)
答案 2 :(得分:0)
我正在使用其中一个宏,然后我浏览this post。
有意义的是你不希望在开发过程中设置为nil,因为你希望它在dealloc引用上崩溃而不是将它发送到nil。