1

MyClass* obj = [[MyClass alloc] initWithX:X]Objective-C で記述することは一般的な方法です。initWithX通常、次のように定義されます。

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
    }
    return self;
} 

私の質問は: 初期化が失敗した場合はどうなりますか? 例外をスローしたくないのですが、エラーを示すにはどうすればよいですか? を返すnilと、呼び出し元はポインターを解放できなくなります。

4

2 に答える 2

3

初期化が何らかの理由で失敗した場合は、self を解放する必要があります。初期化で発生する可能性のある例外については、必要に応じて追加して@try @catch、解放できるようにする必要がありますself

- (MyClass*) initWithX: (MyArgClass*) X {
    if (self = [super init])  {
        // initialize
        if(myInitializationCodeFailed)
        {
                [self release];
                return nil;
        }
    }
    return self;
}

アップデート

初期化が失敗する可能性がある場合、初期化コードで with から例外を発生させません。呼び出し元に情報を提供したい場合は、NSError返される を受け入れるように初期化子をリファクタリングします。

- (MyClass*) initWithX: (MyArgClass*) X error:(NSError**)error {

コメントで Alexei Sholik が指摘しているように、オブジェクトの割り当てと初期化の初期化失敗の処理セクションを確認してください。

于 2011-03-25T16:52:25.933 に答える
1

基本的に、これはあなたの質問に答えます。

初期化失敗の処理

一般に、初期化メソッド中に問題が発生した場合は、releaseメソッドを呼び出してselfを返す必要がありますnil

このポリシーには、主に次の 2 つの結果があります。

  • 初期化メソッドから受け取るすべてのオブジェクト (独自のクラス、サブクラス、または外部呼び出し元) はnil、それを処理できる必要があります。まれに、呼び出し元が呼び出し前にオブジェクトへの外部参照を確立している場合は、すべての接続を元に戻す必要があります。
  • dealloc部分的に初期化されたオブジェクトが存在する場合でも、メソッドが安全であることを確認する必要があります。

...

于 2011-03-25T17:04:49.930 に答える