6

直到五分钟,我才确信我对 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

显然 STEP ONE 将保留计数增加 1alloc

我也知道第三步将保留计数增加 1addSubview

但是第二步发生了什么???为什么它增加了保留数???
和ARC有关系吗??

4

5 回答 5

7

根据该方法的NSObject 协议参考retainCount上的 Apple 文档:

重要此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能在一个对象上保存了任何数量的延迟释放,所以您不太可能从中获得有用的信息方法。

于 2012-05-22T12:02:19.320 回答
2

一旦您与任何框架方法或函数进行交互,该retainCount方法就变得完全无用,因为您不知道这些东西在它们的黑匣子中做了什么(它们可以将您的对象添加到自动释放池或其他任何东西)并且您不应该关心它。

用于retainCount调试内存管理问题总是一个坏主意。有关避免它的更多理由,请参阅此答案。

于 2012-05-22T12:06:46.427 回答
2

我在这里有一个方便的指南:何时使用retainCount?

简而言之,retainCount 很少会像您认为的那样。在不知道如何实现UITableViewUIView实现的情况下,您无法知道保留计数应该是多少。而且我们甚至没有考虑自动释放...

于 2012-05-22T12:15:17.327 回答
0

在第二步中:- 通过使用 self. tableView,tableview 属性的getter(设置为retain)将被调用。因此,当您的财产被分配和保留时,保留计数分别增加。

每当你必须分配一个保留属性时,你应该覆盖它的 getter 方法,这称为惰性实例化。

更好地在它的吸气剂中分配你的表视图,例如

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

    return _tableView;
}
于 2012-06-18T12:50:44.583 回答
0

self.tableView.frameretainautorelease何时tableView从 getter 返回。

于 2012-06-18T13:00:17.193 回答