6

5分までは、Objective cの参照カウントについての理解が優れていると確信していましたが、オブジェクトのretainCountをチェックし始めたとき、私が見たものを見て非常に驚きました。

たとえば、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

明らかにステップ1は保持カウントを1増やしますalloc

また、STEPTHREEで保持カウントが1増加することも知っています。addSubview

しかし、ステップ2で何が起こっているのでしょうか?なぜそれは保持数を増やしたのですか?
ARCとは何か関係がありますか?

4

5 に答える 5

7

メソッドのNSObject Protocol Referenceに関するApple docs によるとretainCount

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

于 2012-05-22T12:02:19.320 に答える
2

ここに便利なガイドがあります:retainCountを使用する場合?

要するに、retainCount があなたの考えを意味することはめったにありません。どのように実装されているかUITableViewを知らなければ、保持カウントがどうあるべきかを知ることはできません。また、オートリリースも考慮していません...UIView

于 2012-05-22T12:15:17.327 に答える
2

フレームワークのメソッドまたは関数と対話するとすぐに、retainCountメソッドは完全に役に立たなくなります。これらのものがブラックボックスで何をするかわからないためです(オブジェクトを自動解放プールなどに追加する可能性があります)。それを気にします。

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

于 2012-05-22T12:06:46.427 に答える
0

self.tableView.frame意志retainとゲッターからautorelease戻るとき。tableView

于 2012-06-18T13:00:17.193 に答える
0

ステップ 2 では、self を使用します。tableView、tableviewプロパティのgetter(retainが設定されているもの)が呼び出されます。したがって、プロパティが割り当てられて両方が保持されると、保持カウントがそれぞれ増加します。

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

ゲッターでテーブルビューをより適切に割り当てます。

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

    return _tableView;
}
于 2012-06-18T12:50:44.583 に答える