このように (つまり、インスタンス変数に直接アクセスして) 使用すると、いいえ、そうはなりません。ただし、プロパティのアクセサ メソッド ([self setS:nil];
またはself.s = nil;
) を使用する場合は、そうです。
また、オブジェクトを解放することとそのメモリを解放することは、2 つのまったく別のことであることに注意してください。オブジェクトは、強い参照がなくなった場合にのみ割り当てが解除されます。つまり、オブジェクトへの最後の参照があり、それを解放します。解放しても (以前に保持されていたために) 他の参照がある場合、まだ割り当ては解除されず、参照カウントだけが 1 つ減ります。
さらに、あなたの例のような保持されたプロパティがある場合は、1.基になるインスタンス変数に直接アクセスしてはいけません。2.次のようなことをしてください
NSString *m = [NSString stringWithString:@"Hellow, World"];
s = [m retain];
なんで?最初の行は単に不要だからです - 本当に、なぜ- [NSString stringWithString:]
ですか? 定数文字列を作成してから、その正確なコピーを作成します-それは余分です。Cocoa の設計者が初心者だった場合、この行もメモリを浪費することになります。同じ不変文字列の 2 つの正確なコピーです。幸いなことに、NSString を実装した人は誰でもこの状況に備えており、このメソッドで引数が定数であることを確認し、定数である場合は何もせずに返すようにしました。したがって、同じポインターが返されますが、いくつかの追加objc_msgSend
の呼び出しが行われます。これは問題ではありません。あなたがしたい。
2 行目も間違っています。繰り返しますが、バッキング ivar をそのまま使用しません。また、プロパティが宣言さretain
れているのには理由があります。オブジェクトをプロパティに設定すると、そのオブジェクトは setter メソッドによって保持されます。手動で保持する必要はありません。
全体として、あなたが書いたほうがいいです
self.s = @"Hello World";
// ...
self.s = nil;
代わりは。