1

これまで、 @property ディレクティブは..alloc] init]それぞれのオブジェクトを取得する getter を生成すると考えていましたが、これが言語の一部ではない理由がわかりません。さらに悪いことに、nil プロパティにアクセスしても例外はありません。

私の推論のどこかに誤解があるように感じますが、どこかはわかりません。プロパティの一部として auto-lazy-instantiator を持つことが、Cocoa 開発のほとんどすべてのケースで理想的ではない理由を知りたいです。

4

2 に答える 2

6

プロパティは、Objective-C のかなり新しい機能です。既存のコードの多くは、ivar が 0 に初期化されることを想定しているため、オブジェクトの getter は として開始されnilます。プロパティの実装は、ほとんどの人が手作業で (またはAccessorizerなどのツールを使用して) 記述していたものと同じタイプのアクセサーを実装するために構築されました。ほとんどの人は遅延ゲッターを手作業で作成したわけではないため、プロパティもこの方法で実装されていませんでした。これは特殊な問題であり、一般的なニーズではありません。

(補足: ここでの私の主張は、atomicアクセサーを手動で記述する最も一般的な方法ではなく、デフォルトに設定されたという事実によって多少信じられています。しかし、それはアクセサーを記述する一般的な方法と互換性があり、ただ遅いだけで、一部の人々はそうしました。定期的にアトミック アクセサーを作成します。怠惰は互換性がありません。)

この動作がまったく望ましくない場合が多くあります。-imageプロパティが空の を自動的に生成することは望ましくありませんUIImagenil何も割り当てられていない場合は、むしろ戻ってきます。多くの場合、「空」と の間には大きな違いがありnilます。nilタイトルは「デフォルトを使用する」を意味する場合もあれば@""、「空にする」を意味する場合もあります。これはかなり一般的なパターンです。私はあまり遅延アクセサーを書きません (しかし、部分的には面倒なので)。

initが指定された初期化子ではなく、賢明な (または正当な) 初期化子でさえないクラスがいくつかあります。

ただし、次のようなプロパティには便利なオプションになる場合があります。

@property (nonatomic, lazy, readwrite, strong) NSMutableArray *stuff;

これが役立つ場合が多い場合は、bugreport.apple.com でレーダーを開く必要があります。

ObjC でメッセージを送信することが合法であるという事実に関しては、それはnil最初に遡ります。多くの場合、これは非常に便利です (多くのエラー チェック コードが不要になります)。場合によっては、非常に厄介なバグの原因になることもあります (エラー チェックを行う必要がある場合もあり、それがいつなのかが常に明らかであるとは限りません)。しかし、変わる可能性は低いです。それは言語の基本的な部分です。

于 2013-10-31T03:56:42.277 に答える