OC学习笔记-内存管理、retain、release和retainCount

#import <Foundation/Foundation.h>

// OC通过引用计数器管理内存
// 一个引用计数器本质是上一个整数
// 引用计数器,存储在对象内部,占据4个字节的存储空间
// 引用计数器的数值表示该对象被引用的次数
// 当使用new、alloc和copy创建一个新的对象的时候,引用计数器的值默认为1
// 如果引用计数器的值减至0,则该对象在堆上占据的空间将被回收
// 如果引用计数器的值不为0,则该对象在堆上占据的空间将被保留

// 给一个对象发送一条retain消息,则该对象的引用计数器的值加1
// 给一个对象发送一条release消息,则该对象的引用计数器的值减1
// 给一个对象发送一条retainCount消息,则可获得该对象的引用计数器的值

// 回收空间、销毁对象时,系统会自动向对象发送一条dealloc消息
// 一般应重写对象的dealloc方法

@interface Person : NSObject
@end

@implementation Person

// 系统在销毁对象回收空间前,会自动调用对象的dealloc方法
- (void)dealloc {
    NSLog(@"Person-dealloc");
    // 重写一个对象的dealloc方法时,必须最终调用父类的dealloc方法
    [super dealloc];
}

@end

int main(int argc, char* argv[]) {
    @autoreleasepool {
        // 新创建的对象,引用计数器默认为1
        Person* p = [[Person alloc] init];
        // 向一个对象发送一条的retainCount消息,得到的返回类型是NSUInteger
        NSLog(@"[p retainCount] = %lu", [p retainCount]);
        
        // 调用一个对象的release方法,会使该对象的引用计数器的值加1
        // 并且返回类型是id类型,返回值是该对象自身
        [p retain];
        NSLog(@"[p retainCount] = %lu", [p retainCount]);
        
        // 调用一个对象的release方法,会使该对象的引用计数器的值减1
        [p release];
        NSLog(@"[p retainCount] = %lu", [p retainCount]);
        
        // 当一个对象的引用计时器的值减至0时,该对象将被销毁
        [p release];
        
        // 堆中对象被系统销毁后,对象指针指向的地址不再可用
        // 此刻,原对象被称为僵尸对象,原指针被称为野指针
        // 如果向该野指针发送一条消息,会报告EXC_BAD_ACCESS错误,也称为野指针错误
        
        // 将指针置空
        p = nil;
        
        // OC中向一个空指针发送一条消息不会报告错误
        [p retain];
        [p release];
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值