9

宣言されたプロパティがアクセサメソッドを生成することは知っていますが、これはどういうわけか単なる構文糖衣です。

self.property = nil多くの人が彼らのdealloc方法で使用していることがわかりました。

1) Apple のメモリ管理ドキュメント、p23 には次のように書かれています。

アクセサー メソッドを使用してインスタンス変数を設定してはならない唯一の場所は、init メソッドと dealloc です。

なぜすべきではないのですか?

2) Apple のObjective-C 2.0 では、p74

宣言されたプロパティは、基本的にアクセサ メソッドの宣言に取って代わります。プロパティを合成すると、コンパイラは存在しないアクセサー メソッドのみを作成します。メソッドとの直接的なやり取りはあり dealloc ません。プロパティは自動的に解放されません。ただし、宣言されたプロパティは、メソッドの実装をクロスチェックする便利な方法を提供 dealloc します。ヘッダー ファイル内のすべてのプロパティ宣言を検索し、マークされていないオブジェクト プロパティ assign が解放され、 マークされているオブジェクト プロパティが解放されていないことを確認できますassign 。

注: 通常、メソッドでは、次の例に示すように、(set アクセサーを呼び出してパラメーターとして渡すのではなく) インスタンス変数を直接オブジェクトdealloc化する必要があります。releasenil

- (void)dealloc { [property release]; [super dealloc]; }

ただし、最新のランタイムを使用してインスタンス変数を合成している場合は、インスタンス変数に直接アクセスできないため、アクセサー メソッドを呼び出す必要があります。

- (void)dealloc { [self setProperty:nil]; [super dealloc]; }

メモの意味は?

私は見つけ[property release];て、[self setProperty:nil];両方とも動作します。

4

1 に答える 1

9

プロパティを設定すると、そのプロパティを監視している他のオブジェクトに通知が送信される可能性があります。その結果、それらのオブジェクトがオブジェクトに対してさらに何かを行おうとする可能性があります。割り当て解除の最中の場合、これはおそらくあなたが望んでいることではありません。したがって、一般的にはrelease、関連するインスタンス変数に直接アクセスする方が安全です。

この種の問題は特定の場合にのみ発生することに注意してください。そのため、inを使用self.property=nilしてコードを記述しdealloc、すべてが正常に機能するようにすることは、多くの場合完全に可能です。これはベストプラクティスではありません。

Objective-Cの「モダンランタイム」では、ivarを指定せずにプロパティを宣言することができます。ランタイムは、合成されたアクセサーと一緒にストレージを合成します。この場合、コードに関する限りivarがないため、ivarを直接リリースすることはできません。self.property=nilですから、あなたはそのルートに行くしかないのです。

于 2011-04-11T12:45:55.187 に答える