`
hua397
  • 浏览: 53790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存管理小记

阅读更多

object-c的内存管理还真是个头痛的问题,看了蛮多的文章讨论,还是免不了犯错,最近小小的实验了一下,做个小记.

view的retiancount变化:alloc为1,被addSubview加1,removeFromSuperView减1,而controller有点不同在于它的view被addSubview,它本身并不会加一,比如:

lab=[[UILabel alloc] init];

[lab setFrame:CGRectMake(120, 100, 80, 20)];

NSLog(@"after alloc---%d",[lab retainCount]);

[self.view addSubview:lab];

NSLog(@"after addSubview---%d",[lab retainCount]);


[lab removeFromSuperview];

NSLog(@"after remove---%d",[lab retainCount]);

[lab release];

NSLog(@"after release---%d",[lab retainCount]);

 

控制台的输出:

2010-11-06 16:07:23.145 viewTest1[1430:207] after alloc,test count is 1

2010-11-06 16:07:23.147 viewTest1[1430:207] after alloc---1

2010-11-06 16:07:23.147 viewTest1[1430:207] after addSubview---2

2010-11-06 16:07:23.148 viewTest1[1430:207] after remove---1

2010-11-06 16:07:23.148 viewTest1[1430:207] after release---1

2010-11-06 16:07:23.149 viewTest1[1430:207] after addSubview,test count is 1

 

标记test的是controller,lab在这里是实例变量,用于测试dealloc,里面用了remove和release,使得lab在这里retainCount变为0,在alloc所在的函数里不显示为0,还是显示为1(奇怪...)

再加几个NSLog,得到

2010-11-06 16:40:23.482 viewTest1[1654:207] fisrt---0

2010-11-06 16:40:23.483 viewTest1[1654:207] after alloc---1

2010-11-06 16:40:23.484 viewTest1[1654:207] after addSubview---2

2010-11-06 16:40:23.484 viewTest1[1654:207] after remove---1

2010-11-06 16:40:23.485 viewTest1[1654:207] after release---1

刚开始显示0,因为lab是nil,[nilretainCount]输出为0.

在类的dealloc里面lab的retainCount已经为0,调用它的任何函数都会BAD_ACCESS,包括[lab retainCount][lab release],所以dealloc里实例变量release之后最好nil一下,因为对nil的任何操作都不会BAD_ACCESS,在dealloc里也就可以release了.

关键还是alloc和release的配对,对于不配对的情况赋值nil可以避免错误

似乎是挺简单的东西,但还是得注意,细节决定成败

 

PS:在mac下排版还真不方便将就将就吧..

分享到:
评论
1 楼 qichunren 2010-11-17  
好,谢谢。

相关推荐

Global site tag (gtag.js) - Google Analytics