代理中delegate为什么是用assign直接赋值而不是用retain

之前一直知道用assign能防止循环引用,让对象得到释放,今天被问到理由,我却有点也有点模糊,后来在网上不断查阅,发现很多人发的UI部分的代理,我这里打算简单来解释一下,如果有觉得不太准确的地方,希望得到指正

接下来,我建立两个类Nurse和Child,以及他们声明文件内容

Child类

#import "Nurse.h"

//委托协议

@protocol TakeCare <NSObject>


- (void)fromTakeCare:(Nurse *)nurse;


@end


@interface Child : NSObject

{

    id <TakeCare> _delegate;

}

@property(nonatomic,assign)id <TakeCare> delegate;


Nurse类

#import <Foundation/Foundation.h>

@class  Child;

@interface Nurse : NSObject  <TakeCare>


@property(nonatomic,retain)Child *child;


@end


这时我们将两个property的setter方法写出来

假设@property(nonatomic,retain)id <TakeCare> delegate;

-(void)setDelegate:(id<TakeCare>)delegate

{

    if (_delegate != delegate) {

        [_delegate release];

        _delegate = [delegate retain];

    }

}//那么Child持有了delegate对象


- (void)setChild:(Child *)child

{

    if (_child != child) {

        [_child release];

        _child = [child retain];

    }

}//Nurse又持有了child对象


Child的delegate就是nurse

按照内存管理的原则,谁持有的对象,那就有责任将其释放,那么在他们会在delloc方法里来释放,这时他们会相互持有,都得不到释放.

当然这不是绝对的情况,有些朋友发现@property(nonatomic,retain)id <TakeCare> delegate;有时候没有问题啊,这里说一下写assign是一般都这样写,不是必须这样写.写上assign是为了避免以上情况的发生,当上面的情况中Nurse没有持有Child,也就不会出现问题了.写上retain是没有任何益处的,反而要是出现以上的情况,就会出现问题,往往用内存检查器又无法检查出问题




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值