一个项目中的多个UIImage + ImageEffects文件

时间:2016-01-01 08:50:54

标签: ios objective-c objective-c-category

我的iOS项目中有几个第三方库(不使用cocoapods ),当我挖掘每个库的文件时,我发现其中4个库有自己的版本UIImage+ImageEffects类别。所以我打算将它们合并到一个单独的文件中,但这有点混乱:

例如,其中一个库 SCLAlertView its version of UIImage+ImageEffects中有一个自定义方法,它引用一个 SCLAlertView的类来访问变量。因此,如果我将该类导入合并文件,它将使新的UIImage+ImageEffects依赖于 SCLAlertView 。我对此感到不舒服,而且不漂亮。所以我需要你们这个想法:

  1. 最好的办法是什么?我应该继续合并它们还是将它们作为单独文件中的单独文件保存?

  2. 项目中同一类别的多个略有不同的版本真的重要吗?它是否会引起任何问题/冲突?

  3. 我经常看到这个:

      

    类_NSZombie_OS_dispatch_group是在两者中实现的?和?? ......

    在我的控制台中。这是由上述事情引起的任何机会吗?

  4. 提前致谢。

    注意:我没有给出一个通用名称,例如"一个项目中同一类别的多个版本"因为UIImage+ImageEffects被许多库用于模糊效果,并且最有可能在项目中以多个略有不同的版本结束

2 个答案:

答案 0 :(得分:2)

回答2会将答案驱动为1(而3听起来像系统中的错误,你应该提交:) :)

项目中同一类别的多个略有不同的版本真的重要吗?它是否会引起任何问题/冲突?

只要所有方法名称都是唯一的,除了问题之外,系统类上的类别对于代码库的长期可维护性来说是非常糟糕的。

但是,如果类别都具有相同名称的方法 - 他们可能会这样做 - 那么只会使用其中一个,哪个是不确定的。

因此,是的,你需要合并它们。或者,更好的是,通过将它们重构为辅助类或其他东西来完全消除它们(然后针对原始代码库提交错误并让它们进行更改)。

答案 1 :(得分:2)

如果您将第三方库构建并集成为静态库,则每个lib都是隔离的并使用自己的类别版本,事情应该可以正常工作。在这种情况下,您应该将类​​别保留在库的内部,并避免在公共标题中通过#include公开它们。 编辑:正如bbum所指出的,类别方法是否隔离其包含的静态lib;将库包装为静态库并不能解决OP的问题。

如果您只有一个构建目标并按源集成lib,只要重复方法实现没有区别(即使这可能导致大量链接器警告),事情也会正常工作。

如果类别实现不同,将出现问题,因为结果行为(即在运行时使用的类别方法)未定义(请参阅this post)。在这种情况下,我不知道问题的解决方案;一个不好(但工作)的解决方案是重命名(前缀)每个lib类别中的方法,并在相应的lib中使用重命名的方法。例如。在库A中,您可以将imageByApplyingLightEffectToImage:重命名为a_imageByApplyingLightEffectToImage:,并相应地更改对A内该方法的所有调用。正如我所说,我只会将这种方法作为最后的手段。