内存管理高级

1.属性的内部实现原理
  (1)assign 语义属性的内部实现 :
       setter:    
-     - (void)setName:(NSString *)name
        {
            
_name=name;
        }

        - (
NSString *)name
        {
            
return _name;
        }
        注:这种方法对于对象类型的数据 容易产生野指针的情况  一般在属性类型为 非对象类型时使用  
  (2)retain
         - (void)setName:(NSString *)name
        {
            
if (_name!=name) {   //如果不进行判断可能会造成野指针的错误
                [
_name release]; //先对旧的 release
                
_name=[name retain];//在对新的 retain
            }
        }

        - (
NSString *)name
        {
            
return [[_name retainautorelease
];
        }

     
  (3)copy
         - (void)setName:(NSString *)name
        {
            
if (_name!=name) {
                [
_name release];
                
_name=[name copy];//和 retain 的唯一区别点
            }
        }

        - (
NSString *)name
        {
            
return [[_name retainautorelease
];
        } 
//这一种 getter 方法只是coacoa 编程规范中的建议格式 保证最安全
注: 对于 retain 和 copy 的使用
    当关注的是 值 而不是 内存地址 的时候使用copy
    当关注的是 内存地址 不是 值 的时候使用 retain
 2.注意上面的 setter 方法可能会造成 实例变量_name的内存泄露  
    要解决这个内存泄露 可以在 类的 dealloc 方法中将 所有 retain 和 copy 的实例变量进行释放 [_name release];
  dealloc方法 是NSObject的一个实例方法,与alloc对应用于内存空间的回收      
              系统在内存的引用计数为0时自动调用 忌手动调用
  记住两句话: 谁创建(alloc,retain,copy)谁释放(release)
            谁要使用谁就retain
  正常的 dealloc 的实现方法
  - (void)dealloc
{
//在 dealloc 中释放类的实例变量
//先释放自身类中的 对象类型的实例变量
    [
_name release];
    [
_gender release];
    [
_car release];
//在调用从父类继承的 dealloc 方法 释放从父类继承而来的实例变量
    [
super dealloc];//注意必须要写 而且永远在最后一行
}
3.便利构造器的内存管理(便利构造器在 内存管理 方面的便利之处)
  + (Person *)personWithName:(NSString *)name gender:(NSString *)gender
{
    
Person *per=[[Person alloc]initWithName:name gender:gender];
    
return [per autorelease
];//最完美的解决方案,既不会内存泄露,也不会产生野指针
}//注意命名,返回值的命名规范

4.对于 Collection 即 NSArray NSDictionary,NSSet 等容器类 ,他们会自动管理自己内部的元素 
        加入 collection 中的对象会被 retain 
        移除 collection 的对象会被 release
        collection 被释放的时候 会对内部所有的对象 release 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值