1、避免循環(huán)引用
平常使用代理時(shí),只是關(guān)注的不能造成循環(huán)引用,用strong修飾就會(huì)造成循環(huán)引用嗎?答案是可能會(huì)。
就拿UITableviewController來(lái)說(shuō),控制器擁有tableView對(duì)象(控制器強(qiáng)引用了tableView),tableView有delegate屬性,UITableViewController又要監(jiān)聽tableView的代理,如果delegate屬性使用的strong,tableView又強(qiáng)引用了UITableviewController控制器,就造成了循環(huán)引用,使用weak就不會(huì)造成這個(gè)問(wèn)題。
self.tableView.delegate = self;

QQ20181222-211940@2x.png
2、不讓delegate屬性跟外界對(duì)象的生命周期相關(guān)聯(lián)
如果用strong修飾,會(huì)對(duì)監(jiān)聽代理的對(duì)象造成強(qiáng)引用,從而對(duì)該對(duì)象的生命周期產(chǎn)生影響。
現(xiàn)在項(xiàng)目中有一個(gè)FLDog的類,頭文件如下
@class FLDog;
@protocol FLDogDelegate <NSObject>
@optional
- (void)dogEat:(FLDog *)dog;
@end
@interface FLDog : NSObject
/** delegate*/
@property (weak, nonatomic) id<FLDogDelegate> delegate;
@end
還有一個(gè)FLPersion類,
@implementation FLPersion
- (void)dealloc {
NSLog(@"FLPersion dealloc!!");
}
@end
在控制器中讓persion對(duì)象成為dog的代理,
- (void)viewDidLoad {
[super viewDidLoad];
FLPersion *per = [[FLPersion alloc] init];
self.dog = [[FLDog alloc] init];
self.dog.delegate = per;
}
運(yùn)行程序,viewDidLoad方法執(zhí)行完畢,per對(duì)象dealloc方法執(zhí)行,對(duì)象被銷毀(沒有強(qiáng)引用),這個(gè)是正常的情況,但是如果把代理改成strong修飾的話就不一樣了,viewDidLoad方法執(zhí)行完,per對(duì)象是不會(huì)銷毀的,因?yàn)?code>per被dog的delegate屬性強(qiáng)引用了,是釋放不了的。