A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


在iOS开发当中,如果是从C/C++转过来的开发人员一定得注意,obj-c中的autorelease变量作用域问题。
如有下面一个类;
[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em][size=1em]<a  target="_blank" rel="nofollow">@interface</a> ViewController : UIViewController  
[size=1em]{  
[size=1em]    NSDate *memberDate;  
[size=1em]    NSDate *properDate;  
[size=1em]}  
[size=1em]   
[size=1em]@property(nonatomic, retain) NSDate* properDate;  
[size=1em]   
[size=1em]<a  target="_blank" rel="nofollow">@end</a>




然后在类实现中对其成员变量初始化: [size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em][size=1em]- (void)viewDidLoad  
[size=1em]{  
[size=1em]    [super viewDidLoad];  
[size=1em]    memberDate      = [NSDate date];  
[size=1em]    self.properDate = [NSDate date];  
[size=1em]}




然后在类的成员方法中用使用这两个成员变量,如[memberDate description]。这时候memberDate的值是无效的,而properDate的值是有效的。为什么会这样呢?
因为memberDate = [NSDate date];这句执行后,memberDate指向的是一个autorelease的变量,这些autorelease的变量在runloop下一次轮询的时候会被release。所以memberDate就是c/c++中的野指针,野指针会让程序crash掉。而property是用retain声明的属性,所以成员变量properDate指向的地址retrain count是1,不会被auto release,所以是有效的内存空间,当然就不会crash了。

得出的教训:autorelease变量最好在其作用域内使用,除非你手动retrain,如上面代码可改变memberDate = [[NSDate date] retrain];这样memberDate指向的地址就与类的生命周期一样,retrain count为1,不会被autorelease。但是在dealloc方法里一定要手动[memberDate release]不然就有内存溢出。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马