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下排版还真不方便将就将就吧..