OC解決大量使用switch...case 語句的問題

先來看一張圖片
在這裏插入圖片描述

項目中我們總是不可避免的要是用到if...else..語句,或者大量使用swift...case... 語句,對於少量的判斷,也無可厚非了,但是對於大量的判斷,就會讓我們的代碼看上去特別亂,有些浪費代碼了。

OC 包括其他語言都給我們提供瞭解決這種困境的方法。這裏我說一下OC的使用。在這之前希望讀者對 Selector 有一定的瞭解。

①、假如代碼使用了大量的判斷,我們要儘量保證,每個判斷中的執行代碼都可以抽出去放在一個方法中執行。 也就是說如果還要使用if…else或switch…case… ,那麼保證每個判斷中只執行一句代碼(調用一個方法),看上去代碼也是整潔的。
②、這裏我引入了容器的概念,在OC中 array、dictionary、set 都可以作爲容易使用,讀者可根據自己的愛好選擇容器。在我的項目裏,我使用array作爲容易,存儲了所有判斷中可執行到的方法,如下圖: 在這個容器中存儲的字符串,每個字符串都是一個方法名。每個方法都是即將在if判斷下要執行的方法。
在這裏插入圖片描述
③、使用Selector 、NSSelectorFromString 該方法可將字符串名轉化爲SEL,用於供對象執行,前提是該方法是存在的。
因此大量的if…else… 就簡化成了如下兩句代碼

- (void)initBanner:(BannerType)type{
    SEL selec = NSSelectorFromString(self.selectArr[type]);
    [self performSelector:selec];
}

這兩句代碼即可代替七個 if判斷 來執行正確的方法了,這樣就做到了大量簡化代碼。注意 BannerType 是定義好的從0開始的枚舉值,所以用array做容器了。

④、優化,如上所述的代碼,存在一個可能leak(泄漏) 的問題,xcode已經給出了警告。如下圖:
在這裏插入圖片描述
這個警告標示 這樣寫代碼可能存在內存泄漏的問題,因此,我們做出如下優化。

- (void)initBanner:(BannerType)type{
    if (!self) {
        return;
    }
    SEL selec = NSSelectorFromString(self.selectArr[type]);
    IMP imp = [self methodForSelector:selec];
    void(*func)(id,SEL) = (void *)imp;
    func(self,selec);
}

這樣就沒有這個警告了。

總結:解決 大量判斷 的關鍵在於 NSSelectorFromString 方法。希望能幫助到有困惑的朋友們

我是磊懷 2849765859 QQ 歡迎指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章