11

我知道关于编码风格的讨论往往以灾难和无休止的火焰战争告终,但这不是我想要达到的。在过去的十年中,我主要看到了deallocObjective-C 中方法的两种不同编码风格。第一个也是最常见的一个是放在dealloc文件的底部。这也是 Apple 在 Xcode 默认模板中使用的样式。这背后的逻辑似乎dealloc是在接近对象末尾时调用,因此文件末尾似乎是一个很好的比喻。

另一方面,一些人倾向于将指令dealloc直接放在@synthesize指令下方。在我看来,这有两个主要缺点:

  1. 文件的顶部充满了无聊的代码
  2. 很难找到课堂上的重要部分,您必须向下滚动。

在我看来,最大的优势是您可以在属性和相应的release消息之间建立直接的视觉联系。

另一件事是 niling 已经发布的变量。虽然我不认为这是必要的,尤其是在整个变量在dealloc结束后被破坏的对象上下文中,但我也倾向于将变量设为 nil。我习惯于对函数范围内的变量执行此操作,所以我只是与我的编码风格保持一致。

这就是我的大多数课程的样子:

@implementation Bar

@synthesize foo;

- (void)dealloc
{
  [foo release], foo = nil;

  [super dealloc];
}

// Initializers and other methods…

我已经提到了一些优点和缺点。对于这个话题你有什么看法?您使用的编码风格是什么dealloc为什么?还有其他我忘记提及的优点和缺点吗?

我不想在这里引发一场火焰战争。我只是想知道你使用什么风格,如果你有具体的原因,或者这最终对你来说是否无关紧要。

4

6 回答 6

16

我喜欢将dealloc实现放在初始化器的正下方。这样,当我添加一个新的实例变量时,我会在release它之后立即记住init它。

此外,我发现使用该#pragma mark指令可以更轻松地浏览文件非常有帮助。所以我在一个名为“初始化程序”的标题下将init和方法“分组”在一起。dealloc浏览文件时,使用这些标题可以更轻松地找到您要查找的内容,而不会被该dealloc方法分心。

这可能是无聊的代码,但人很重要。

于 2010-01-25T15:48:39.053 回答
10

如果您没有特定的理由,请不要在 dealloc 中将您的 ivar 设置为 nil。它没有任何用途,充其量只是掩盖了程序员的错误,你最好找出而不是隐藏。

于 2010-01-25T23:46:44.637 回答
8

我的订单:

  1. 综合和@dynamic指令(我在 2011 年的某个时候开始在顶部做这些;以前,它们与访问器实现一起使用)
  2. 类方法(+load, +initialize, +sharedFoo, 其他)
  3. 初始化器
  4. dealloc
  5. finalize
  6. 自定义访问器实现
  7. 协议一致性方法,按协议分组(通常带有#pragma mark指令)
  8. 通知处理程序方法(通常在顶部的类扩展中声明)
  9. 其他方法(通常在顶部的类扩展中声明)

dealloc方法内:

  • 不要使用隐式(属性访问)或显式的访问器消息。任何不纯的自定义访问器都可能不安全地调用部分释放的对象。(初始化程序也是如此。)
  • 不要将 ivars 设置为nil. 对象被部分释放;你为什么还在给它发消息?(如果你不是,那么没有任何东西在查看 ivars 的值。)
  • (如果将 ivars 设置为 是适当的nil)不要滥用逗号运算符。像这样的表达式[foo release], foo = nil混合了类型(首先void来自消息表达式,然后id来自赋值表达式)。这些是单独的陈述;这样写。
  •  
    [super dealloc]总是最后一个并且总是在它上面有一个空行,强调它的存在。

当然,我也打开了“将警告视为错误”,所以如果我忘记了[super dealloc],我会破坏我的构建。

于 2010-01-26T08:33:29.410 回答
5

我将我的 dealloc 放在顶部,就在 @synthesize 指令的下方。这是一个有点笨拙和无聊的代码,但是非常重要的代码,所以它得到了最高的收入。此外,能够比较属性和 -releases 是至关重要的。

于 2010-01-25T15:46:25.690 回答
3

我把它放在底部。这使我可以在添加需要取消分配的内容时简单地结束并转到它。我也不希望它在我的属性合成器周围,因为这是欺骗性的。并非我 dealloc 的所有内容都必须附加一个综合访问器。哎呀,它甚至不一定都在初始化程序中。如果我尝试以这种方式使用快捷方式,我可能会搞砸。

于 2010-01-26T00:07:04.060 回答
-1
- (id)init{
   self = [super init];
   if( self ) {
      someVar = [[NSMutableArray alloc] init];
      // something like the following shouldn't be released:
      someString = [NSString stringWithFormat:@"ANumber: %d",10];
   }
   return self;

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

我就是这样做的:)

于 2010-01-25T17:24:57.760 回答