之前一直知道用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对象
按照内存管理的原则,谁持有的对象,那就有责任将其释放,那么在他们会在delloc方法里来释放,这时他们会相互持有,都得不到释放.
当然这不是绝对的情况,有些朋友发现@property(nonatomic,retain)id <TakeCare> delegate;有时候没有问题啊,这里说一下写assign是一般都这样写,不是必须这样写.写上assign是为了避免以上情况的发生,当上面的情况中Nurse没有持有Child,也就不会出现问题了.写上retain是没有任何益处的,反而要是出现以上的情况,就会出现问题,往往用内存检查器又无法检查出问题