1. ホーム
  2. objective-c

[解決済み] Objective-Cでは、なぜself = [super init]がnilでないことを確認する必要があるのですか?

2022-04-24 04:12:34

質問

Objective-Cのinitメソッドの書き方について、一般的な質問があります。

initメソッドは初期化を続ける前にself = [super init]がnilでないことをチェックすべきであると、あらゆるところ(Appleのコード、書籍、オープンソース・コードなど)で見かけます。

initメソッドのAppleのデフォルトテンプレートは。

- (id) init
{
    self = [super init];

    if (self != nil)
    {
        // your code here
    }

    return self;
}

なぜ?

つまり、initがnilを返すことはあるのでしょうか?NSObjectでinitを呼んでnilが返ってくるなら、よっぽど何かが狂っているんだろう?その場合は、プログラムを書かないほうがいいかもしれませんね...。

クラスのinitメソッドがnilを返すことは、本当によくあることなのでしょうか?もしそうなら、どんな場合に、そしてなぜ?

解決方法は?

例えば

[[NSData alloc] initWithContentsOfFile:@"this/path/doesn't/exist/"];
[[NSImage alloc] initWithContentsOfFile:@"unsupportedFormat.sjt"];
[NSImage imageNamed:@"AnImageThatIsntInTheImageCache"];

...といった具合です。(注意: NSData はファイルが存在しない場合、例外を投げるかもしれません)。問題が発生したときに nil を返すことが期待される動作である領域はかなり多く、このため、一貫性を保つために、ほとんど常に nil をチェックすることが標準的なプラクティスとなっています。