Objective-Cでオブジェクトを初期化する処理は、-init
メソッドなどの初期化メソッドで実装されます。
よく見かけるのはこんな例ですね。

objective-c>>

  • (id)init
    {
    [super init];
    /* initialization code */
    return self;
    }
    <<--

しかしながら、基底クラスの初期化処理[super init]の最中に、
メモリアロケーションの失敗などによって正常に初期化が行われなかった場合に備えて、次のようなエラーハンドリングを行った方が良いでしょう。

objective-c>>

  • (id)init
    {
    if(self = [super init]){
    /* initialization code */
    }
    return self;
    }
    <<--

この辺の処理はXcodeなどが生成するひな形にも書かれていますね。

さて、ここからが本題ですが、上述の
/* initialization code */
の中で初期化が失敗したときは、どうしたら良いでしょうか。
仕様的には、初期化に失敗したら nil を返す必要がありますが、
その際、途中までの段階で確保したリソースを解放する必要があるでしょう。
つまり、[super init]の中で確保されたであろうリソースを解放する必要があります。

objective-c>>

  • (id)init
    {
    if(self = [super init]){
    /* initialization code /
    if(/
    initialization failure /){
    /
    release all resources */
    [super dealloc];
    return nil;
    }
    }
    return self;
    }
    <<--

ということで、こんな感じに[super dealloc]
を呼び出して nil を返します。
ここで、[super release] を呼び出すと、
参照カウンタが0になり、 [self dealloc]
が呼び出されてしまうので注意が必要です。
[self dealloc]を呼び出すようにする場合は、上述の
/* release all resources */
の中でリソースを解放せずに、[self dealloc]
の中で解放するようにする必要があります。
しかし、失敗した初期化処理の中で中途半端に確保したリソースを、
正しく解放する為には、[self init]
の内部で解放処理まで行った方が楽な気がします。
あるいは、以下の様に初期化済みのものだけ解放するようなコードを
[self dealloc]に書いておくという手もあるかもしれません。

objective-c>>
#define RELEASE(x) if(x) [(x) release]

  • (void)dealloc
    {
    RELEASE(_something);
    [super dealloc];
    }
    <<--

こんなコードを見ると、なんだかノスタルジーを感じます。

ちなみに関係ないですが、このブログシステムでは、
Objective-Cのソースコードを以下のような記法でSyntax highlightさせる事ができます。

pre>>
objective-c>>
/* Objective-C code */
<<objective-c
<<pre

posted by genki genki on Mon 6 Oct 2008 at 22:09 with 4 comments
Psychs Psychs 10/06 22:33
[nil release] は、問題なく実行できるので、init の中で初期化処理に失敗した場合は、単に [self release] でいいんじゃないかと。
瀧内元気 瀧内元気 10/06 22:40
おーなるほど! それは便利ですねー。Thx!

まだまだC++脳だなあ。
shachi shachi 10/07 08:18
deallocでsuperはあまり使わないでselfで使った方が使い出が良いですよ。
瀧内元気 瀧内元気 10/07 10:58
確かに。[nil release] がOkなら [self dealloc] で良さそうですねー。
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
coffeescriptdefergroongajsmemonodenodejs
Comments rssrss
https://casino-pinco.clients.site/ https://casino-pinco.clients.site/: Pinco Casino регистрация открыла доступ к крутому ... 04/14 21:54
https://moscowremontnik.ru https://moscowremontnik.ru: Слышал много положительных отзывов о Московском ... 04/14 19:08
https://mellstroy.at https://mellstroy.at: Hi there! This is my first visit to your blog! We ... 04/14 19:03
https://russ-remont.ru/ https://russ-remont.ru/: Очень толковая статья, сохраню себе. 04/14 18:45
https://russ-remont.ru/ https://russ-remont.ru/: Приятно видеть профессиональный подход к делу. 04/14 17:56
https://russ-remont.ru/ https://russ-remont.ru/: Ваши советы сэкономили мне кучу времени. 04/14 17:39
https://russ-remont.ru/ https://russ-remont.ru/: Русский Ремонт — отличный выбор для тех, кто ценит... 04/14 17:26
https://www.remontexpress.ru https://www.remontexpress.ru: Радует, что компания работает официально по догово... 04/14 17:20