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"); }
相关文章推荐
- 数据结构练习1——链表合并
- 编辑过滤器配置(edit filter configuration)
- 【NOJ】(java)求最值
- nginx+tomcat
- 自定义标签 foreach
- Mjpg_Streamer 的移植
- 重拾单片机 第三天 中断讲解(一)
- JSP中EL表达式取值问题记录(已解决)
- windows无法与设备或资源 主dns 通信
- dhfs客户端编写
- LeetCode 145: Binary Tree Postorder Traversal
- httpd+tomcat(3) -- mod_jk
- 彼得原理
- Java:网络编程之登陆服务器
- vim插件管理之Vundle
- Scrum Meeting 10.28
- Cygwin中文乱码
- HTTP基本认证和摘要认证
- 项目40.1 小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
- httpd+tomcat(2) -- proxy_ajp_module