我的iOS学习历程 - OC第九天

今天主要讲的是内存的管理方法

1.IOS的内存管理中 Mac是使用的垃圾回收(gc) 有轮询延迟

   手机用的是 引用计数


2.引用计数的方法:

( 1 ) alloc

alloc 开辟空间引用计数 0 ->1

Person *p1 = [[Person alloc]initWithName:@"wanglong" age:18];


( 2 ) retain

retain 使用引用计数 +1

Person *p2 = [p1 retain];

( 3 )  retainCount

计数的数字

NSLog(@"%ld",[p3 retainCount]);

( 4 ) release

release 影响引用计数 -1,

当对象的引用计数为0 的时候,该对象就会被系统释放

[p1 release];

(5) autorelease

autorelease 在未来的某一时刻引用计数 会自动-1

autorelease  需要自动释放池-1

autorelease  是要依托自动释放池去释放的

出了自动释放池 相当于系统会给释放池中间调用了autorelease对象发送一个 release消息

自动释放池:

    @autoreleasepool {
        [p1 autorelease];// 相当于一个栈 出入池跟出入栈一个道理
    }
    
    for (int i = 0; i < 10; i++) {
        Person *p = [[Person alloc]initWithName:@"Curry" age:21];
        @autoreleasepool {//  释放池加在里面好 如果i< 很大的数就可能内存溢出
            [p autorelease];
        }
    }
注意:类方法,便利构造器方法 使用autorelease,其他方法需要再外部释放,是一个规范

( 6 ) copy

实现拷贝协议中的方法,需要满足NSCoping协议

copy方法对引用计数的影响要看你是怎么想法的,看你怎么实现copyWithZone方法

伪拷贝 拷贝完还是一个对象(直接返回)

- (id)copyWithZone:(NSZone *)zone{
    //  浅拷贝
    //  拷贝后 有两个对象 但是他们的值是同一个值 引用计数变化 被拷贝的对象不变 拷贝出来的新对象从0->1
    //  深拷贝 拷贝出新对象 并且 对象值也重新拷贝一份再赋值
    //  对字符串进行拷贝 拷贝的结果 要看字符串这个类如何实现的拷贝方法 对不可变字符串的拷贝 其实相当于 直接retain一次
    //  可变字符串 拷贝时 就是真拷贝了一个新的出来
    NSString *str = [_name copy];    
    Person *p = [[Person alloc ]initWithName:str age:_age];
     //  这叫做伪拷贝(直接返回)
    return p;
    
}

( 7 ) dealloc

书写规范 一定要写在类的最上面,系统自动调用

如果重写的话:
-(void)dealloc
{
    //  如果要写东西都写在[super dealloc]上面,防止出现野指针情况
    //  如果重写dealloc方法 必须要调用父类的方法
    //  保证 对象可以被释放
    [super dealloc];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值