随意细解:OC -- 内存管理高级

内存管理高级

属性的内部实现原理

  1. assign

    setter方法:

    - (void)setName:(NSString *)name
    {
         _name = name;
    }
    

    getter方法:

    - (NSString *)name
    {
        return _name;
    }
    
  2. retain (copy相同)

    setter方法:

    - (void)setName:(NSString *)name
    {
          if (_name != name) {
        // 如果你对空release,相当于你什么都没做
        // 如果_name不为空,将原来的值释放
        [_name release];
        // 对形参retain,计数加1
         _name = [name retain];
        }
    
    }
    

    getter方法:

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

案例分析:

 NSString *stuName = [[NSString alloc]initWithFormat:@"bb"];
 Student *stu = [[Student alloc]initWithName:@"aa"];
 stu.name = stuName;
 [stuName release];

 NSString *name = [[NSString alloc]initWithFormat:@"dj"];
 stu.name = name;
 [name release];
 [stu release];

学生类的.m文件:

-(void)dealloc
{
    [_name release];
    [super dealloc];
}

dealloc内释放实例变量

举例:有Student类,类中有name属性

main函数中:

NSString *stuName = [[NSString alloc]initWithFormat:@"bb"];
Student *stu = [[Student alloc]initWithName:@"aa"];
stu.name = stuName;

这时:stu的计数为1,stuName的计数为2。(init之后为1,调用retain属性的name的set方法, ‘ _name = [name retain]; ’方法中name的计数加1,这里是stuName的计数加1,所以stuName的计数为2)

[stuName release];
[stu release];

这时,stu的计数为0,系统自动调用dealloc方法。但是stuName经release之后计数为1,没有释放,产生内存泄露。所以我们在dealloc方法中要release一下stuName。在类中重写dealloc方法:

-(void)dealloc
{
    [_name release];
    [super dealloc];
}

便利构造器方法的实现原理

举例:有Student类,类中有name属性

Student.h文件:

+ (instancetype)studentWithName:(NSString *)name;

Student.m文件:

+ (instancetype)studentWithName:(NSString *)name
{
    Student *s = [[Student alloc]initWithName:name];
    return [s autorelease];
}

调用autorelease方法,在自动释放池结束时释放对象。

collection的内存管理

collection就是NSArray,NSDictionary,NSSet…等容器类。collection会⾃主管理⾃⼰内部的元素。加⼊collection中的对象会被retain,移除出collection的对象会被release,collection被释放会对内部所有对象release。

举例:数组

Person *p1 = [[Person alloc]init];
Person *p2 = [[Person alloc]init];
Person *p3 = [[Person alloc]init];

// 数组在添加元素时,如果你把一个元素添加到容器类的对象中(数组、字典、集合中),那么系统将自动给数组中的元素发送retain消息,从而使数组中的元素引用计数+1
NSArray *arr = [[NSArray alloc]initWithObjects:p1,p2,p3, nil];
[p1 release];
[p2 release];
[p3 release];

   // 数组在释放时,如果数组释放时,那么在释放之前,系统会自动给数组中的每一个元素发送一个release消息,从而使数组中的元素引用 -1
 [arr release];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值