/** 操作引用计数器的方式:每个对象内部(对象的堆内存里面)都有一个引用计数器变量,表示对象被引用的次数。 1:retainCount:获得对象的引用计数器的值 2:retain:能够让对象的计数器值变量+1,要想计数器变量加1就要调用对象的retain方法 3:release:让对象的计数器变量值 - 1,要想计数器变量减1就要调用对象的release方法 怎么判断对象被释放? dealloc方法:只要调用了这个方法,就代表对象即将被释放. 僵尸对象:已经被释放的对象,堆空间已经释放的对象。 野指针:指向僵尸对象的指针 空指针:指向nil的指针,给空指针发送消息(调用方法)不会报任何错误. 内存泄露:程序结束了,堆对象内存没有释放。 */ #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *p = [[Person alloc] init]; //1 [p retain]; // 让对象引用计数器值 +1 // 2 [p retain]; // 3 [p release]; // 减-1 // 2 [p release]; [p release]; // 对象被释放 NSLog(@"%lu",h.retainCount);//如果正常空间被回收这句话无法输出。 p = nil; // 给空指针发送消息,不会报任何错误,后面调用方法也不会出错。 [p release]; // p就是野指针,想要操作Person这个僵尸对象 // } return 0; } // //Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end //Person.m #import "Person.h" @implementation Person - (void)dealloc { NSLog(@"人被释放啦不要再做其他的事来"); // 必须调回父类的dealloc方法 [super dealloc]; } @end
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5314461.html,如需转载请自行联系原作者