2011-05-06 60 views
2

我已经在iOS中看到了几种不同的内存管理方法,就释放属性而言。经过与同事的一番辩论,我的脑袋里的利弊已经变得混乱了。这些不同的dealloc策略有哪些优缺点?

,我希望能得到利弊,让我和其他人可以轻松地选择一个默认的态度,同时仍时做出例外理解的摘要。这里有3个变化,我看到:

假设@property (nonatomic, retain) MyObject *foo;

// Release-only. Seems to be the favored approach in Apple's sample code. 
- (void)dealloc { 
    [foo release]; 
    [super dealloc]; 
} 

// Property accessor set to nil. 
- (void)dealloc { 
    self.foo = nil; 
    [super dealloc]; 
} 

// Release, then nil. 
- (void)dealloc { 
    [foo release]; 
    foo = nil; 
    [super dealloc]; 
} 

如果你有不同的变化增加,在这里评论,我会编辑的运算。

+0

+1有关几分神秘话题/约定一个很好的问题。我个人在'dealloc'内'释放',并在'viewDidUnload'方法中将属性设置为'nil'(对于非IBOutlet属性)。我不知道这是否是一个明确的答案,但我期待阅读一些答案。 – Stuart 2011-05-06 19:53:57

回答

2

版本(1):是最好的。其他每个人都有可能有害的属性。

版(2):它一般不宜使用的dealloc存取(或init)。这背后的原因是该对象正在被拆除(或创建)并处于不一致的状态。如果您正在编写一个库,其他人稍后可能会覆盖某个访问者或未知其在对象处于不一致状态时可能会被调用的情况,那么尤其如此。 (当然,即使苹果有时会打破这个规则-[UIView initWithFrame:]调用-[UIView setFrame:]如果该参数不CGRectZero它可以使为乐趣的调试

版(3);伊娃设置为nil没有用处,实际上它可能掩盖一个错误并调试困难。要知道为什么是这样的话,可以考虑下面的一段代码,假设myObject的有一个版本(3)dealloc

FastMovingTrain* train = [[FastMoving alloc] init]; 
MyObject* myObject = [[MyObject alloc] init]; 
myObject.foo = train; 
[train release]; 
// my myObject.foo is the only thing retaining train 
... 

.... 
[myObject release]; 

// Because of version (3) dealloc if myObject 
// points to the dealloced memory this line 
// will silently fail... 
[myObject.foo applyBrakes]; 

有趣的是这个代码提供了一个机会,当设置展示一个变量为nil af ter release的确有意义。通过修改代码可以使代码更具弹性,如下所示。

FastMovingTrain* train = [[FastMoving alloc] init]; 
MyObject* myObject = [[MyObject alloc] init]; 
myObject.foo = train; 
[train release]; 
// my myObject.foo is the only thing retaining train 
... 

.... 
[myObject release]; 
myObject = nil; 

// This assertion will fail. 
NSAssert(myObject, @"myObject must not be nil"); 
[myObject.foo applyBrakes]; 

只要我0.02美元。

+0

我希望能在这里更精确一点。例如,“没有太多好处”或“根本没有好处”?如果“不多”,那么有什么好处?这听起来像#2是一个坏主意,那么如何选择#1和#3。请记住,这里的想法是提供一个程序员团队可以用来通知他们的编码准则的客观事实。 – clozach 2011-05-13 18:44:30

+0

我想这是一个公平点。答案没有任何好处,甚至可能是有害的。我会编辑答案。 – idz 2011-05-13 20:25:11

+0

顺便在谷歌的Objective-C风格指南有很多明智的意见http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml它也链接到苹果的编码规则了。 – idz 2011-05-13 20:52:48

相关问题