1.關於委託
第一次接觸多播委託是在C#中,首先關於委託,簡單說下,就是標識方法的類,它給方法的簽名和返回型別指定名稱,可以說是類的提升,它非常類似C++裡面的函式指標,但是C#的委託是型別安全的,而C++的函式指標可以將任何一個地址作為函式指向,可以通過定義的委託物件呼叫方法,在C#中是這樣的:
delegate int demoDelegate(int input)
複製程式碼
這是一個簡單的委託實現,有方法引數,返回值,它可以作為同等方法引數型別和返回值型別的Function,簡單實用:
int demoFunc(int input) {
return input * input
}
複製程式碼
上述只是一個簡單的函式,使用時只需要初始化委託,並把方法賦值給委託就可以在後面使用了:
myDelegate = new demoDelegate(demoFunc)
int newNumber = myDelegate(10);
//就像是同直接呼叫方法一樣,沒什麼不同。
複製程式碼
2.關於多播委託
那什麼是多播委託?有了上面單個委託的基礎,在理解多播委託就很好理解了。
namespace DelegateApplication
{
class MulticastDelegates
{
//宣告一個委託,委託沒有返回值
public delegate void DemoDelegates(String name);
//第一個方法
public static void Hello(String name)
{
Console.WriteLine("您好, {0}", name);
}
public static void GoodBye(String name)
{
Console.WriteLine("再見, {0}", name);
}
public static void Main()
{
DemoDelegates delegates = Hello;
//使用+=給委託新增方法
delegates += GoodBye;
String name = "張三李四";
Console.WriteLine("這是一種方法呼叫:");
delegates(name);
Console.WriteLine("這是另一種方法呼叫");
//返回委託的呼叫列表。
Delegate[] allDelegates = delegates.GetInvocationList();
//注意這裡的allDelegates列表中儲存的是DemoDelegates型別的委託
foreach (DemoDelegates dele in allDelegates)
{
dele(name);
}
}
}
}
複製程式碼
執行結果
這是第一種方法呼叫
你好,張三李四
再見,張三李四
這是另一種方法呼叫
你好,張三李四
再見,張三李四
複製程式碼
。。。。其實就是一個委託陣列。。。嗯。多播委託有很多好處,有了多播委託我們就可以同時呼叫相同型別的方法了。哈哈哈
3.ios中的多播委託
上述的使用都是在C#中實現的,那麼在ios中我們可以使用多播委託嗎?答案是不能。。。。。但是我們可以自己實現。 最簡單的就是宣告一個陣列,專門用於儲存delegate委託,當需要執行時遍歷委託陣列,並一一執行。 注意:
NSPointerArray* _delegates; //用於儲存委託delegate
複製程式碼
_delegates = [[NSPointerArray alloc] initWithOptions:NSPointerFunctionsWeakMemory];
//弱引用物件的陣列
複製程式碼
- (void)addDelegate:(id<Delegate>)observer
{
//新增委託
@synchronized(_delegates) {
if (![_delegates containsObject:observer]) {
[_delegates addObject:observer];
}
}
}
- (void)removeDelegate:(id<Delegate>)observer
{
//刪除委託
@synchronized(_delegates) {
[_delegates removeObject:observer];
}
}
複製程式碼
通過上述操作我們就有了自己的多播委託了,當然同樣的服務我們可以使用Notification來實現,實現更方便,但是Notification有很多先天性的缺點:
- [NotificationCenter defaultCenter] postNotification],這種方式是同步的,就是訊息接收者全部處理完訊息之後,post這方才會繼續往下執行,因此,儘量不要做太耗時的操作。並且在哪個執行緒發,就在哪個執行緒收。 2.再呼叫addObserver後,結束之後還要呼叫observer的移除 3.通知傳送時,需要查詢observer接受通知物件。
在使用多播委託時並不要查詢,而是直接遍歷呼叫 通過弱引用物件陣列可以保證,當陣列中物件被釋放後,陣列中同時會置為NULL,有助於避免記憶體leak.
以上就是簡單的關於多播委託的理解.