OC-024.OC中多对象的手动内存管理
2015-12-10 14:26
417 查看
OC中现在开发的基本用到的是ARC的机制,但是网上有些框架可能是早期来发的,用的是MRC的机制,所以还是有必要了解一下MRC下多对象的内存是如何管理的。
OC中手动内存管理黄金法则:谁调用new,alloc,retain,copy,multableCopy,谁就要调用对应的release或autorelease
口诀:有加必有减(你需要一个对象的时候就retain一下,不需要的时候就release一下)
OC中手动内存管理黄金法则:谁调用new,alloc,retain,copy,multableCopy,谁就要调用对应的release或autorelease
口诀:有加必有减(你需要一个对象的时候就retain一下,不需要的时候就release一下)
#import <Foundation/Foundation.h>//------mian #import "LSPerson.h" int main(int argc, const char * argv[]) { LSPerson *per = [[LSPerson alloc] init];//p=1 LSIpad *ipad1 = [[LSIpad alloc] init];//i=1 [per setIpad:ipad1];//p=1 i=2 [ipad1 release];//p=1 i=1 //如果新创建一个ipad2,那么 LSIpad *ipad2 = [[LSIpad alloc] init];//p=1 i=2 per.ipad = ipad2;//把新ipad赋值给per,在set方法中不release ipad1,那么ipad1永远不回收了 [ipad2 release]; // per.ipad = ipad1; 如果没有上面的ipad2,又再次把ipad1赋值给它,那么在set方法中先被release了,那么已经清空的ipad是不能在调用retain的。需要加if判断地址是否一致。如果地址是一致的就什么都不做。 [per release]; return 0; }
#import <Foundation/Foundation.h>//------LSPerson.h #import "LSIpad.h" @interface LSPerson : NSObject { LSIpad *_ipad; } -(void) setIpad:(LSIpad *)ipad; @end
#import "LSPerson.h"//------LSperson.m 最重要的是setter方法内部的内存管理 @implementation LSPerson -(void) setIpad:(LSIpad *)ipad{ //成员对象创建的时候就被初始化为nil,对nil进行release是没任何效果的 //此处要加一个判断 //如果他们两不相同,才需要内存管理的代码 // [ipad retain]; // _ipad = ipad; 上面2句可以合并成下面 _ipad = [ipad retain]; //retain方法返回的是一个同类型的指针 if(_ipad != ipad){ [_ipad release]; _ipad = [ipad retain]; } } -(void)dealloc{ // [_ipad release];//如果不加release那么人回收了,ipad还在,造成内存泄露 // _ipad = nil; self.ipad = nil; //等价与上面2句,self。ipad会进入set方法,先release,再nil NSLog(@"%s",__func__); [super dealloc]; } @end
#import <Foundation/Foundation.h>//------LSIpad.h @interface LSIpad : NSObject @end
#import "LSIpad.h"//------LSIpad.m @implementation LSIpad -(void)dealloc{ NSLog(@"%s",__func__); [super dealloc]; } @end
相关文章推荐
- HTML5创建一个径向/圆渐变
- C# Winform 中webBrowser显示html内容时禁止错误提示的方法
- matlab 将数组写入txt
- Visual Studio 使用Web Deploy 3.6发布项目
- ssh-keygen的使用方法
- Android view 数据缓存
- eclips 快捷键
- [django-xadmin]如何在 search_fields和list_filter 中包含外键字段
- rsync + inotify同步服务器数据
- HBase内置过滤器的一些总结
- leetcode:258 Add Digits-每日编程第二题
- nexus 的使用及maven的配置
- 将博客搬至CSDN
- OC self注意事项
- MAC版Eclipse的常用快捷键
- Apache编译与安装 RedHat enterprises 6.2
- 木已成粥
- eclipse自动把参数arg0、arg1改为req、res
- log4j使用及详解
- HTML5创建线条渐变