2

したがって、メソッド名内でinitを使用することは、そのメソッドがオブジェクトの新しいインスタンスの初期化を実現しない場合はお勧めできないことを理解しています。しかし、シングルトン型クラスの場合はどうでしょうか。私がこのようなことをした場合:

+ (MyClass*) sharedInstance {

    __block MyClass *sharedInstance = nil;
    static dispatch_once_t once_token;
    dispatch_once(&once_token, ^{
        sharedInstance = [[MyClass alloc] init];
    });

    return sharedInstance;
}

そして、別の方法があります:

- (void) initializeInstance {
  // Do some stuff
  // Never call the init method
}

これを行うと、余分な保持サイクルやその他の奇妙なARC動作が発生しますか?

4

1 に答える 1

5

この方法-initializeInstanceは問題ありません。これはファミリに分類されないinitため、コンパイラは特別に扱いません。ドキュメントによると、ファミリに分類されるためにinitは、次のルールを満たしている必要があります。

  1. セレクターの最初のコンポーネントは、、initまたはで始まり、initその後に小文字以外の文字が続く必要があります。initializeInstanceこのルールを満たしていません。
  2. さらに、initメソッドはObj-Cオブジェクトを返す必要があります。initializeInstanceこのルールも満たしていません。このルールに違反すると、メソッドを単に。として扱わないのではなく、コンパイル時エラーが発生すると思いますinit
于 2012-11-14T21:44:23.760 に答える