Crazyydevil的博客 记录代码人生

代理为什么要使用weak修饰

2016-07-15
iOS

代理为什么要使用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时,在对象没有其他引用时,可以顺利释放并销毁。


Comments