私はメモリ管理について読んでいますが、初期化子メソッドでアクセサメソッドを使用することは推奨されていません。
質問:初期化メソッドでアクセサメソッドを使用すべきではないのはなぜですか?
私はそれについて混乱しています。
私はメモリ管理について読んでいますが、初期化子メソッドでアクセサメソッドを使用することは推奨されていません。
質問:初期化メソッドでアクセサメソッドを使用すべきではないのはなぜですか?
私はそれについて混乱しています。
これは私が書いた例で、2 つのことを示しています。
この例は初期化に焦点を当てていますが、dealloc
同様のカテゴリの問題が発生しやすくなっています。具体的な例として、オブジェクトが で部分的に復活dealloc
する可能性があり、参照カウントの不均衡が潜在的な危険になる場合があります。
簡単に言えば、オブジェクトが必要とするデータの正しい初期化とクリーンアップに集中したいということです。
もっと読む:
なぜself.myInstance = nilではなくmyInstance = nilなのですか?
これは、双方の開発者にとって少し宗教的な問題であり、ARC の登場により、この問題はさらに混乱しました。
いくつかの理由は次のとおりです。
オブジェクトが完全に初期化されておらず、アクセサーが完全に初期化されたオブジェクトに依存している可能性があります。
アクセサーには副作用がある可能性があり、オブジェクトは完全に初期化されていません。一般的な副作用の 1 つは、最初の使用時に iVar をインスタンス化することです。
dealloc
これらの引数は、 (ARC 以外のコードの場合) でのアクセサーの使用にも適用できます。
KVC オブザーバーは、ゲッター メソッドとセッター メソッドを監視します。誰もあなたの所有物を監視しないと絶対に確信していない限り、あなたはトラブルを求めています. オブザーバーが部分的に解放されたオブジェクトをいじくり回しているという欠陥は、再現が非常に難しく、テストがほぼ不可能です。
intiailiser メソッドでアクセサ メソッドを使用しない主な理由は、dealloc
おそらく Mac OS X の開発に起因するものであり、iOS ではおそらくそれほど問題ではありません。Mac OS X GUI 開発には、コントロールのプロパティをオブジェクトのプロパティにバインドできる「バインディング」と呼ばれる便利なものが含まれているため、ユーザーがコントロールを更新すると、「バインディング」によってプロパティが自動的に更新されます。プログラムが (アクセサ メソッドを介して) プロパティを更新すると、「バインディング」によってコントロールが自動的に更新されます。
多くのバインドは Key-Value Observing で行われます (私はそう思います)。Key-Value Observing は、オブジェクトが他のオブジェクトのプロパティへの変更を観察する場合です。アクセサー メソッドを使用してプロパティを変更すると、オブジェクトを監視しているすべてのオブジェクトに通知が送られ、プロパティの新しい値に対してアクションを実行できるようになります。オブジェクトのオブザーバーは、完全にではなく、部分的に初期化または部分的に割り当て解除されたインスタンスのみを処理するため、アクセサー メソッドを使用すると、キー値監視通知を発生させたくない場合 (初期化中や割り当て解除中など) にトリガーできます。初期化されたインスタンス。
また、別の主な懸念事項があります。それは、オブジェクトがサブクラス化される場合です。アクセサー メソッドを使用してオブジェクトのプロパティを設定する場合、実際にはサブクラスのアクセサー メソッドを呼び出すことになります (別のアクセサー メソッドを実装している場合)。Objective-C 開発での継承は .NET などと比較してまれであるため、これが問題になる可能性は低くなります。