1. 程式人生 > 實用技巧 >iOS踩坑之多代理模式使用注意

iOS踩坑之多代理模式使用注意

結論

在需要使用多代理效果時,必須卡在把最後一個代理物件加入multiDelegate的delegates陣列後,再對delegate賦值。否則,會導致後新增的代理物件特有的代理方法不回撥的問題。
多代理庫推薦:

https://github.com/JyyJDast1/MultiDelegateOC

原理

打斷點得知:在用多代理物件對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;