iOS中autorelease变量应注意的问题

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 19:31 点击:
在iOS开发当中,如果是从C/C++转过来的开发人员一定得注意,obj-c中的autorelease变量作用域问题。
 
如有www.2cto.com下面一个类;
 
 
 
@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
 
然后在类实现中对其成员变量初始化:
 
 
 
- (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]不然就有内存溢出。
 
摘自 开心程序

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Lexical or Preprocessor Issue 'xxx.h
      • ios学习笔记(二)xcode 4.3.2下实现基本交互
      • ios版本的helloworld
      • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
      • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
      • IOS类似iphone通讯录TableView的完整demo【附源码】
      • UITableView一些方法
      • [iPhone中级]iPhone团购信息客户端的开发 (二)
      • iphone(object-c)内存管理(1)
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1