iOS中autorelease变量应注意的问题
2013-02-20 21:14
381 查看
在iOS开发当中,如果是从C/C++转过来的开发人员一定得注意,obj-c中的autorelease变量作用域问题。
如有下面一个类;
[cpp]
view plaincopyprint?
@interface ViewController : UIViewController
{
NSDate *memberDate;
NSDate *properDate;
}
@property(nonatomic, retain) NSDate* properDate;
@end
然后在类实现中对其成员变量初始化:
[cpp]
view plaincopyprint?
- (void)viewDidLoad
{
[super viewDidLoad];
memberDate = [NSDate date];
self.properDate = [NSDate date];
}
然后在类的成员方法中用使用这两个成员变量,如[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]不然就有内存溢出。
如有下面一个类;
[cpp]
view plaincopyprint?
@interface ViewController : UIViewController
{
NSDate *memberDate;
NSDate *properDate;
}
@property(nonatomic, retain) NSDate* properDate;
@end
@interface ViewController : UIViewController { NSDate *memberDate; NSDate *properDate; } @property(nonatomic, retain) NSDate* properDate; @end
然后在类实现中对其成员变量初始化:
[cpp]
view plaincopyprint?
- (void)viewDidLoad
{
[super viewDidLoad];
memberDate = [NSDate date];
self.properDate = [NSDate date];
}
- (void)viewDidLoad { [super viewDidLoad]; memberDate = [NSDate date]; self.properDate = [NSDate date]; }
然后在类的成员方法中用使用这两个成员变量,如[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]不然就有内存溢出。
相关文章推荐
- iOS中autorelease变量应注意的问题
- iOS: 让自定义控件适应Autolayout注意的问题
- 90-自动释放池 autorelease经典案例题原理,创建和销毁,经典案例题,注意问题
- iOS: 让自定义控件适应Autolayout注意的问题
- IOS注意之NSAutoreleasePool
- IOS开发ARC forbids explicit message send of 'autorelease'错误解决办法
- iOS注意的一些小问题
- 总结iOS开发当中一些特别注意的问题
- IOS基础:retain,copy,assign及autorelease
- Autorelease 原理,有一点注意,目前在ox 64位objc_retainAutoreleasedReturnValue 是优化编译的,将直接return对象不会注册到autoreleasep
- iOS使用autolayout和sizeclass 解决适配问题(一)
- Win7中设置环境变量的注意问题
- 头文件中定义 const 全局变量应注意的问题
- 使用hibernate中connection.release_mode,connection.autocommit和transaction.auto_close_session用法及需要注意的问题
- 关于java数组中某个元素用等号赋值给中间变量需要注意的问题。
- ios 开发中遇到 UIAlertView 窗口无法release的问题
- iOS 推送的一些示例代码和注意的问题
- 变量作用域应该注意的问题
- makefile中使用变量及函数(3.注意.o输出路径问题)
- iOS tableview 刷新一般不会注意的小问题