ios中的多播委託

PeachRain發表於2018-10-12

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有很多先天性的缺點:

  1. [NotificationCenter defaultCenter] postNotification],這種方式是同步的,就是訊息接收者全部處理完訊息之後,post這方才會繼續往下執行,因此,儘量不要做太耗時的操作。並且在哪個執行緒發,就在哪個執行緒收。 2.再呼叫addObserver後,結束之後還要呼叫observer的移除 3.通知傳送時,需要查詢observer接受通知物件。

在使用多播委託時並不要查詢,而是直接遍歷呼叫 通過弱引用物件陣列可以保證,當陣列中物件被釋放後,陣列中同時會置為NULL,有助於避免記憶體leak.

以上就是簡單的關於多播委託的理解.

相關文章