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

来源:互联网 发布:2016淘宝睡衣模特红人 编辑:程序博客网 时间:2024/05/19 19:32

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







0 0
原创粉丝点击