1

copy を使用し、NSString プロパティで保持し、それをローカル変数に割り当てると、実際にはどういう意味ですか?

@interface SomeClass : NSObject 
{ 
   NSString *name; 
   NSString *name2;
} 

@property (nonatomic, retain) NSString* name1;
@property (nonatomic, copy) NSString *name2; 

文字列の値を次のような別の NSString 変数に代入すると:

NSString *newString1 = name1;
NSString *newString2 = name2;

name1 と name2 の保持数はどうなりますか?

NSString *anotherString1 = [NSString alloc]initWithString:name1];
NSString *anotherString2 = [NSString alloc]initWithString:name2];

ここで name1 と name2 の保持カウントはいくつになりますか?

4

1 に答える 1

6

オブジェクトを割り当てると、その保持カウントは 1 から始まります。保持するたびに 1 増加し、解放するたびに 1 減少します。ここでのもう 1 つの要因は自動解放です。自動解放プールのコンテキストでオブジェクトが自動解放されると、その保持カウントは、自動解放プールが空になると自動的に 1 減ります。

あなたの例では、最初の例では、name1両方とも同じnewString1オブジェクトへのポインターになり、そのオブジェクトの保持カウントは同じままです。明示的に保持を呼び出した場合にのみ上昇します。とと同じです。2 番目の例では、NSString オブジェクトの新しいインスタンスを割り当てているため、新しいインスタンスは 1 の保持カウントを持ちます。また、それらを解放または保持しなかったため、同じままになります。name2newString2anotherString1anotherString2name1name2

2 番目の例は、基本的に と同じcopyです。オブジェクトの保持カウントを単純にインクリメントしながら、独自の保持カウントを持つ新しいretainオブジェクトを作成します。copyここでフラグを立てる関連事項は、name1and name2as プロパティの宣言にあります。これらのプロパティを設定すると、ここで説明したように動作し、そこで設定したものを保持name1して新しいオブジェクトとしてコピーします。NSStringname2

このすべてのもう 1 つの優れた概要はこちらで、下部にさらに詳細な議論へのリンクがあります。

以上のことから、OS X ではガベージ コレクションを使用でき、iOS 5 では自動参照カウントを使用できます。これらは、このようなことを心配する必要性をなくすことはできませんが、大幅に減らすことができます.

于 2012-01-03T07:39:56.590 に答える