将具有“Assign”属性的对象设置为nil

时间:2011-01-19 23:01:27

标签: iphone cocoa cocoa-touch

如果我使用“Assign”属性定义变量,那么在dealloc方法中将它们设置为nil是否可以?

@property (nonatomic, assign) id test;

- (void)dealloc {
    self.test = nil;
}

2 个答案:

答案 0 :(得分:4)

最好直接释放ivar。如果子类重写属性的setter方法,则对象可能会泄漏,因为未调用setter。考虑:

@interface ClassA
@property (readwrite, retain) id anObject;
@end

@interface ClassB : ClassA
@end

@implementation ClassA
@synthesize anObject;

- (void)dealloc {
    self.anObject = nil;

    [super dealloc];
}
@end

@implementation ClassB
- (void)setAnObject: (id)anObject {
    // do nothing!
}
@end

ClassB的实例将泄漏anObject

答案 1 :(得分:1)

如果您通过属性设置器(不推荐)进行 如何,那么是。

如果您直接分配,那么否,因为保留的对象会泄漏。

所以这很好:

- (void) dealloc {
   self.test = nil;
   [super dealloc];
}

但这是禁止

- (void) dealloc {
   test = nil;
   [super dealloc];
}

我的建议是将release消息发送到-dealloc中所有保留的ivars,这样可以很好地处理,因为如果test恰好是nil,那么什么都不会发生。

相信我。直接在release发送-dealloc。就是这样。

- (void) dealloc {
   [test release];
   [super dealloc];
}