2012-05-22 12 views
6

5分まで、Objective cの参照カウントについての私の理解は優れていると確信していましたが、retainCountオブジェクトの検査を開始したとき、私は何を見たのか非常に驚いていました。目的c - 参照カウント

例えばmyViewControllerはのUITableViewがあります。私の驚きに入力を

.hファイル

@interface RegularChatViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> 
{ 
    UITableView *_tableView; 
} 
@property (nonatomic, retain) IBOutlet UITableView *tableView; 

.mファイル

@synthesize tableView = _tableView; 

- (void)loadView 
{ 
    _tableView = [[UITableView alloc] init]; // STEP ONE 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 

    self.tableView.frame = CGRectMake(0, 0, 320, tableHeight); // STEP TWO 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 

    [self.view addSubview:self.tableView]; // STEP THREE 
    NSLog(@"tableView retain count: %d",[_tableView retainCount]); 
} 

をした

明らか
tableView retain count: 1 
tableView retain count: 2 
tableView retain count: 3 

STEP ONE増加は、私もそのSTEP THREE増加を知ってalloc

と1で、カウントを保持addSubview

と1で、カウントを保持しているが、STEP TWOで起こっていただきました!?なぜそれが保持カウントを増やしたのですか?
ARCとは関係がありますか? retainCount方法についてNSObject Protocol Reference上のAppleのドキュメントによると

+0

おそらく '.frame'はテーブルビューなしでは存在できず、したがって保持カウントを追加するでしょうか? –

+0

良い推測; 'frame'は構造体を直接返します。参照でさえない。そこに依存関係はありません。 – bbum

答えて

7

重要この方法は、メモリ管理の問題をデバッグする際に一般的に無価値のあります。任意の数のフレームワークオブジェクトが参照を保持するためにオブジェクトを保持していて、同時に自動解放プールがオブジェクトに任意の数の遅延リリースを保持している可能性があるため、この情報から有用な情報を得ることはほとんどありません方法。

+1

確かに。開発者がログアウトしてコードにカウントを保持するのを見ると、私は本当に心配しています。オーナーシップルールに従い、しばらくの間毎にリークツールを使用する限り、あなたは金色です。 –

+0

それは救済です:)ありがとう – Eyal

2

とすぐに一切のフレームワークメソッドや関数を対話として、retainCount方法は完全に無用になり、あなたはこれらの事が彼らのブラックボックスに何をすべきかわからないので(彼らは、自動解放プールに、あなたのオブジェクトを追加することができますまたは何でも)あなたはそれを気にするべきではありません。

retainCountを使用してメモリ管理の問題をデバッグすることは、常に悪い考えです。さらにそれを避ける理由は、this answerを参照してください。

2

私はここに便利なガイドがあります。要するにWhen to use retainCount?

を、retainCountはほとんどあなたがそれをすると思う何を意味しません。 UITableViewUIViewがどのように実装されているのかが分からなければ、にはの保持カウントを知ることができません。そして、我々はさらに自動リリースを考慮に入れていません...

+0

本当に役に立つウェブページではありません、そして、私はそれがここに掲載されて見て嫌いです。説明のない1つの単語はリンクのポスターに気分を与えるだけです。それは質問者を少し助けることはありません。 –

+0

スクロールダウンしましたか?また、すべての関連情報を回答に含めることにも注意してください。 –

+0

答えはもちろんです。私はそのページを一度スクロールしたことはありませんでした。下のリンクでは、思ったよりもはるかに優れていますが、他の何もないという仮定を見た唯一の人にはなりません。ほとんどの画面でボトムコンテンツの最初の部分が表示されます。 –

0

よくステップ2: - 自己を使って。 tableView、tableviewプロパティのgetter(retainと設定されている)が呼び出されます。 プロパティが割り当てられ、保持されているので、それぞれカウントの増加を保持します。

保持されているプロパティを割り当てる必要があるときはいつでも、そのゲッターメソッドを上書きする必要があります。これは遅延インスタンス化と呼ばれます。

getterでテーブルビューをよりうまく割り当てる。

-(UITableView *) tableView 
{ 
    if(!_tableView) { 
      _tableView = [[UITableView alloc]init]; 
    } 

    return _tableView; 
} 
0

self.tableView.frame意志retainautoreleaseゲッターからtableViewを返します。

関連する問題