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

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值