delegate屬性為什么要用weak修飾?

1、避免循環(huán)引用

平常使用代理時(shí),只是關(guān)注的不能造成循環(huán)引用,用strong修飾就會(huì)造成循環(huán)引用嗎?答案是可能會(huì)。
就拿UITableviewController來(lái)說(shuō),控制器擁有tableView對(duì)象(控制器強(qiáng)引用了tableView),tableViewdelegate屬性,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被dogdelegate屬性強(qiáng)引用了,是釋放不了的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,652評(píng)論 1 32
  • 1.設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評(píng)論 0 12
  • 1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令偉閱讀 1,129評(píng)論 0 10
  • 在開發(fā)中我們經(jīng)常使用代理,或自己寫個(gè)代理,而代理屬性都用weak(assign)修飾,看過(guò)有些開發(fā)者用strong...
    songsong619閱讀 2,680評(píng)論 0 1
  • 輝子今年三十歲,應(yīng)該是處在男人的黃金年齡,有點(diǎn)成熟還有點(diǎn)男孩的小浪漫。長(zhǎng)得不算太帥但也不難看,一個(gè)普通的銷售經(jīng)理,...
    我不是蝸牛閱讀 3,428評(píng)論 5 5

友情鏈接更多精彩內(nèi)容