iOS踩坑之多代理模式使用注意
阿新 • • 發佈:2020-08-08
結論
在需要使用多代理效果時,必須卡在把最後一個代理物件加入multiDelegate的delegates陣列後,再對delegate賦值。否則,會導致後新增的代理物件特有的代理方法不回撥的問題。
多代理庫推薦:
原理
打斷點得知:在用多代理物件對delegate賦值時,會觸發庫中AIMultiDelegate.m檔案中- (BOOL)respondsToSelector:(SEL)selector
方法,如果此時,multiDelegate物件的delegates陣列中的所有代理物件還不全(還未包含你想新增的代理物件),那麼未被新增的代理物件特有的實現的代理方法會被respondsToSelector方法判定為NO,導致無法被呼叫。即使後面重新通過addMultiDelegate或對delegate賦值,都不會生效。
因此,必須在你確保沒有代理物件需要加入multiDelegate的delegates陣列時,才能對delegate進行賦值。
示例
A庫有代理方法1,2;
B庫需要實現A庫的代理方法1;
C功能需要實現A庫的代理方法1和方法2;
為使BC都響應A的代理方法,需要使用多代理。
錯誤示例,下面方法會導致C類中實現的A的特有代理方法(特有:意指B中未實現)無法回撥:
[A物件 addMultiDelegate:B物件];
A物件.delegate = A物件.multiDelegate;
[A物件 addMultiDelegate:C物件];
正確示例:
[A物件 addMultiDelegate:B物件]; ... [A物件 addMultiDelegate:C物件]; A物件.delegate = A物件.multiDelegate;