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 欢迎指教

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