質問 1: 行番号 7 に従えばすべて問題なく、行番号 9 を使用するとメモリ リークが発生します。私が知っているように、selfは現在のオブジェクトを指しており、self.objectまたは単にオブジェクトを使用した場合、それ以上の違いはありません。
Line 7: name = [NSString stringWithString:@"Hello"];
Line 8: OR
Line 9: self.name = [[NSString alloc]initWithString:@"Hello"];
7 行目では、自動解放されたオブジェクトを返す便利なコンストラクターを使用し、オブジェクトをivarに直接割り当てています。name
現在、自動解放されたオブジェクトを保持プロパティに割り当てることは問題ありませんが、自動解放されたオブジェクトを明示的に保持せずに ivar に直接割り当てることは正しくありません。
name = [[NSString stringWithString:@"Hello"] retain];
9 行目では、保持されたオブジェクトを提供する alloc/init を使用しています。このようなオブジェクトを ivar に直接割り当てるのは正しいですが、retain プロパティに割り当てる前に自動解放する必要があります。
self.name = [[[NSString alloc]initWithString:@"Hello"] autorelease];
これについては、オブジェクト保持カウントの観点から推論できます。
便利なコンストラクターは保持カウントを 1 に設定しますが、これは後でrelease
フレームワークによって行われる呼び出しによって自動的に減少します。
alloc/init は、明示的に呼び出さない限り減少しない保持カウント 1 を提供しますrelease
。
オブジェクト保持カウントが 0 になると、割り当てが解除されます。
保持数に関する推論は、このメモリ管理の問題全体を見て、フレームワークの奥深くで何が起こっているかを理解するための方法にすぎません。ただし、これがオブジェクトのライフサイクルを分析する適切な方法であるとは限りません。
では、どちらが name の値を設定するためのもので、どちらが値を取得するためのものでしょうか? name = [NSString stringWithString:@"Hello"];
OR self.name = [NSString stringWithString:@"Hello"];
ORの違い_name = [NSString stringWithString:@"Hello"];
name = [NSString stringWithString:@"Hello"];
と
_name = [NSString stringWithString:@"Hello"];
与えられた2つのケースではまったく同じです。これにより、プロパティの setter(/getter) メソッドがバイパスされ、ivar に直接割り当てられます。この場合、自動解放されたオブジェクトを ivar に直接割り当てているため、アプリは遅かれ早かれクラッシュします。これは正しいでしょう:
_name = [[NSString stringWithString:@"Hello"] retain];
また
_name = [[NSString alloc] initWithString:@"Hello"];
ivar を として宣言するプログラムでは、 を使用して参照_name
できないことに注意してください。質問1のようにivarを明示的に指定せずにプロパティのみを宣言した場合は、ivarを直接参照するためにname
使用できます(この場合、コンパイラによって自動的に生成されたivarになります)。name
name
一方で:
self.name = [NSString stringWithString:@"Hello"];
プロパティ アクセサー メソッド (実際にはセッター) を使用します。あなたのプロパティは として宣言されてretain
いるので、便利なコンストラクタによって返された autoreleased 変数をそれに割り当てても問題ありませんstringWithString:
。
質問 3: プロパティを作成する場合、メモリ リークを示すようにメモリを割り当てる必要がありますか?
これは私にはよくわかりません。
メモリ管理の基本について読むのに適したドキュメントは、Apple の Advanced Memory Management Programming Guide のMemory Management PolicyおよびPractical Memory Managementです。