プロパティは、Objective-C のかなり新しい機能です。既存のコードの多くは、ivar が 0 に初期化されることを想定しているため、オブジェクトの getter は として開始されnil
ます。プロパティの実装は、ほとんどの人が手作業で (またはAccessorizerなどのツールを使用して) 記述していたものと同じタイプのアクセサーを実装するために構築されました。ほとんどの人は遅延ゲッターを手作業で作成したわけではないため、プロパティもこの方法で実装されていませんでした。これは特殊な問題であり、一般的なニーズではありません。
(補足: ここでの私の主張は、atomic
アクセサーを手動で記述する最も一般的な方法ではなく、デフォルトに設定されたという事実によって多少信じられています。しかし、それはアクセサーを記述する一般的な方法と互換性があり、ただ遅いだけで、一部の人々はそうしました。定期的にアトミック アクセサーを作成します。怠惰は互換性がありません。)
この動作がまったく望ましくない場合が多くあります。-image
プロパティが空の を自動的に生成することは望ましくありませんUIImage
。nil
何も割り当てられていない場合は、むしろ戻ってきます。多くの場合、「空」と の間には大きな違いがありnil
ます。nil
タイトルは「デフォルトを使用する」を意味する場合もあれば@""
、「空にする」を意味する場合もあります。これはかなり一般的なパターンです。私はあまり遅延アクセサーを書きません (しかし、部分的には面倒なので)。
init
が指定された初期化子ではなく、賢明な (または正当な) 初期化子でさえないクラスがいくつかあります。
ただし、次のようなプロパティには便利なオプションになる場合があります。
@property (nonatomic, lazy, readwrite, strong) NSMutableArray *stuff;
これが役立つ場合が多い場合は、bugreport.apple.com でレーダーを開く必要があります。
ObjC でメッセージを送信することが合法であるという事実に関しては、それはnil
最初に遡ります。多くの場合、これは非常に便利です (多くのエラー チェック コードが不要になります)。場合によっては、非常に厄介なバグの原因になることもあります (エラー チェックを行う必要がある場合もあり、それがいつなのかが常に明らかであるとは限りません)。しかし、変わる可能性は低いです。それは言語の基本的な部分です。