#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;
}
OC学习笔记-内存管理、retain、release和retainCount
最新推荐文章于 2024-07-15 16:49:10 发布