代理为什么要使用weak修饰
例子
使用weak
Car.h
@protocol CarDelegate <NSObject>
-(void)playCar;
@end
@interface Car : NSObject
@property (nonatomic,weak) id <CarDelegate> delegate;
@end
Car.m
#import "Car.h"
@implementation Car
-(void)dealloc
{
NSLog(@"执行 car dealloc 方法");
}
@end
运行项目 得到执行结果
2016-08-31 11:12:54.078 demoOne[947:28761] 开车
2016-08-31 11:12:54.079 demoOne[947:28761] 执行 people dealloc 方法
2016-08-31 11:12:54.079 demoOne[947:28761] 执行 car dealloc 方法 #### 我们发现car和peopel 都执行了销毁代码,说明使用weak时,可以使delegate指向的对象释放,delegate所在对象也能顺利释放,这和weak的arc用法一致。
使用strong
让我们把delegate的属性设置为strong试试
@property (nonatomic,strong) id <CarDelegate> delegate;
运行项目 得到执行结果
2016-08-31 11:38:45.848 demoOne[1128:38638] 开车
我们发现car和peopel 都没有执行了销毁代码,说明使用strong时,delegate指向的对象当没有额外的对象来持有时,没有顺利释放销毁。
得出结论:当delegate使用weak时,在对象没有其他引用时,可以顺利释放并销毁。