11

コーディング スタイルに関する議論は、大惨事や終わりのない炎上戦争で終わる傾向があることは知っていますが、それは私が到達したいことではありません。dealloc過去 10 年間、私は主に Objective-C のメソッドの2 つの異なるコーディング スタイルを見てきました。最初の最も一般的なものはdealloc、ファイルの最後に配置することでした。これは、Apple が Xcode のデフォルト テンプレートで使用するスタイルでもあります。この背後にあるロジックdeallocは、オブジェクトの終わりが近づいたときに呼び出されるように思われるため、ファイルの終わりは素晴らしい比喩のようです。

一方、ディレクティブdeallocの直下に置く傾向がある人もいます。@synthesize私の意見では、これには2つの大きな欠点があります。

  1. ファイルの先頭には、退屈なコードが散らかっています。
  2. クラスで重要な部分を見つけるのは難しく、下にスクロールする必要があります。

私の意見では、大きな利点は、プロパティと対応するreleaseメッセージを視覚的に直接結び付けられることです。

もう 1 つは、既にリリースされている変数を 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:

  • アクセサー メッセージ、暗黙的 (プロパティ アクセス) または明示的を使用しないでください。不完全なカスタム アクセサーは、部分的に割り当て解除されたオブジェクトで安全に呼び出すことができない場合があります。(イニシャライザについても同様です。)
  • ivar を に設定しないでくださいnil。オブジェクトは部分的に割り当て解除されています。なんでまだメッセージ送ってるの?(そうでない場合は、ivar の値を見ているものは何もありません。)
  • (ivar を に設定することが何らかの形で適切である場合nil) コンマ演算子を乱用しないでください。のような式は型を[foo release], foo = nil混合します (最初voidにメッセージ式から、次にid代入式から)。これらは別個のステートメントです。それらをそのまま書きます。
  •  
    [super dealloc]は常に最後であり、常にその上に空行があり、その存在を強調しています。

もちろん、「Treat Warnings as Errors」もオンにしているので、忘れる[super dealloc]とビルドが壊れてしまいます。

于 2010-01-26T08:33:29.410 に答える
5

私の dealloc は、@synthesize ディレクティブのすぐ下の一番上に配置しました。少し不格好で退屈なコードですが、非常に重要なコードであるため、最高額を獲得しています。また、プロパティとリリースを比較できることも重要です。

于 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 に答える