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

来源:互联网 发布:宁波淘金网络 编辑:程序博客网 时间:2024/05/19 04:53
#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];}@endint 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
原创粉丝点击