ViewDidUnLoad中的SAFELY_RELEASE

时间:2012-03-16 02:02:09

标签: iphone objective-c

这两种方法有什么区别吗?

```

// MACRO FUNCTION

#define SAFELY_RELEASE(__POINTER) { [__POINTER release]; __POINTER = nil; }

// C FUNCTION

void SAFELY_RELEASE(id __POINTER) {
    [__POINTER release]; __POINTER = nil;
}

```

3 个答案:

答案 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。