1

私は財産を持っています:

@property(nonatomic, retain) NSMutableArray *myvar;

最初のケース:

    myvar = [[NSMutableArray alloc] init];
    NSLog(@retainCount: %i:", [myvar  retainCount]);

出力:

保持数: 1

2 番目のケース:

    self.myvar = [[NSMutableArray alloc] init];
    NSLog(@retainCount: %i:", [self.myvar  retainCount]);

出力:

保持数: 2

私の質問は: なぜ 2 番目のケースで保持値が 2 なのですか?

4

4 に答える 4

8

唯一の有効な答えは、決してチェックせず、使用せず、retainCount を信頼することです。デバッグやメモリ管理に直接使用するためのものではありません。

役に立つ: whentouseretaincount.com

しかし、あなたの場合:ARCを使用していないため(そうしないと、コンパイルでretainCountとにかく使用できません)、保持しすぎています。

ここに保持します@property(nonatomic, retain) NSMutableArray *myvar;

そしてここ:self.myvar = [[NSMutableArray alloc] init];

行う:

self.myvar = [[[NSMutableArray alloc] init] autorelease]; //will release once soon

または私のお気に入り、ARC/MRC から独立しており、短い

self.myvar = [NSMutableArray array]; // identical to the first example

またはより明示的

NSMutableArray *var = [[NSMutableArray alloc] init]; 
self.myvar = var; 
[var release];
于 2013-02-16T16:42:43.843 に答える
4

あなたがそれを保持しているalloc/initので+1し
たので+1 self.myvar(あなたの財産宣言に記載されているように)それを保持しているため

alloc/init の後にautorelease1 に戻るとself.myvar、nil に設定すると 0 になります (その間に他に何も保持されていない場合)

しかし、vikingosegundo が言ったように、保持カウントを台無しにしたくありません。OS はいつそれらをノックダウンするかを決定するため、信頼できる状態の尺度として使用することはできません。

于 2013-02-16T16:47:54.130 に答える
1

ARCが登場する前に私が従ったルールは次のとおりです。

「NARC ルール」:

NewAllocRetainまたはを使用する場合はCopy、カウントを 1 増やします。

クラスのインスタンス プロパティを (キーワードを使用して)使用allocしているため、2 番目のケースでは保持カウントは 2 です。それ以外の場合は、合成されたセッターを使用して変数を設定していないため、 を使用していません。理解を深めるために、プロパティが実際に何をするかを調べます。retainselfretain

vikingosegundo は、彼の答えで物事を行う正しい方法をよく説明しています。

それが役立つことを願っています!

于 2013-02-16T17:31:04.653 に答える
0

この回答を参照してください:保持カウントとメンバー変数の初期化に関する質問

最初に、新しい NSArray オブジェクトを初期化します。これは保持カウント 1 です。次に、セッターはオブジェクトをインスタンス var に割り当てるときに保持メッセージをオブジェクトに送信します。これにより、保持カウントが 2 まで増加します。

乾杯。

于 2013-02-16T16:44:59.070 に答える