您的位置:首页 > 其它

OC 内存管理

2015-10-28 22:22 127 查看

ARC(Automatic Reference Counting)

简单地说就是, 系统自动对内存进行管理, 自动添加 retain 和 release 方法. 而不再需要程序员手动添加. 这里暂时不做详细介绍.

MRC(Manual Reference Count)

需要程序员自己写 retain 和 release 方法来进行内存管理. 下面就对在 MRC 中用到的有关内存管理的方法(在 ARC 中不能使用)做一个总结.(以 Person 类为例)

retainCount

该方法可获得对象空间中的引用计数, 返回值为 NSUInteger.

retain 和 copy

Person *per = [[Person alloc] initWithName:@"zhangsan" Gender:@"man" Age:18];
Person *per1 = [per retain];//使用 retain 将per 的值赋给 per1
NSLog(@"%lu", [per1 retainCount]);//输出结果为 : 2
NSLog(@"%lu", [per retainCount]); //输出结果为 : 2
NSLog(@"%lu", per); //per 的地址为 : 0x100400220
NSLog(@"%lu", per1);//per1的地址为 : 0x100400220


Person *per = [[Person alloc] initWithName:@"zhangsan" Gender:@"man" Age:18];
Person *per1 = [per copy];//使用 copy 将per  对象的值赋给 per1对象
NSLog(@"%lu", [per1 retainCount]);//输出结果为 : 1
NSLog(@"%lu", [per retainCount]); //输出结果为 : 1
NSLog(@"%lu", per); //per 的地址为 : 0x100120db0
NSLog(@"%lu", per1);//per1的地址为 : 0x100120c10


由上两例可知:

retain 是指针拷贝, copy 是内容拷贝.

retain 是将per1指向之前per开辟的堆区空间的地址, 引用计数 + 1

copy 是重新开辟一块堆区空间给 per1, 再将 per 的值赋给 per1, per 指向的空间的引用计数还是 1.

copyWithZone

如果要使用 copy 方法的话, 就需要 Person 类遵循 NSCopying 协议. 并将copyWithZone重写, 重写方法如下:

// 该方法在使用 copy 时, 自动调用
- (id)copyWithZone:(NSZone *)zone {
Person *p = [[Person allocWithZone:zone] init];//这里的p 不需要释放, 否则会出现野指针问题
return p;
}


release

release 方法在调用之后立即释放内存, 且在调用该方法之后不能再调用 retainCount 方法, 否则系统会立即崩溃. 使用方法:

[per release];


autorelease

autorelease 方法在调用之后不会立即释放内存, 如果 autorelease 在一个自动释放池里, 那么在释放池结束时, 会顺道将 autorelease 要释放的内存释放掉. 使用方法:

[per autorelease];


alloc 和 dealloc

alloc 可以申请出一块地址, 而dealloc 是对堆区内存空间回收.

dealloc 的使用方法如下:

- (void)dealloc {
[super dealloc];//调用父类的 dealloc 方法.
NSLog(@"调用 dealloc");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: