您的位置:首页 > 其它

OC-024.OC中多对象的手动内存管理

2015-12-10 14:26 417 查看
OC中现在开发的基本用到的是ARC的机制,但是网上有些框架可能是早期来发的,用的是MRC的机制,所以还是有必要了解一下MRC下多对象的内存是如何管理的。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: