Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 多个UIImage+;一个项目中的ImageEffects文件_Ios_Objective C_Objective C Category - Fatal编程技术网

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

Ios 多个UIImage+;一个项目中的ImageEffects文件,ios,objective-c,objective-c-category,Ios,Objective C,Objective C Category,在我的iOS项目中,我有两个第三方库(不使用cocoapods),当我深入研究每个库的文件时,我发现其中4个库有自己的UIImage+ImageEffects类别。所以我想把它们合并到一个文件中,但这有点混乱: 例如,其中一个库SCALlertView中有一个自定义方法,该方法引用回SCALlertView的一个类来访问变量。因此,如果我将该类导入到合并文件中,它将使新的UIImage+ImageEffects依赖于视图。我觉得不舒服,而且也不好看。所以我需要你们的想法: 最好的方法是什么?我应

在我的iOS项目中,我有两个第三方库(不使用cocoapods),当我深入研究每个库的文件时,我发现其中4个库有自己的
UIImage+ImageEffects
类别。所以我想把它们合并到一个文件中,但这有点混乱:

例如,其中一个库SCALlertView中有一个自定义方法,该方法引用回SCALlertView的一个类来访问变量。因此,如果我将该类导入到合并文件中,它将使新的
UIImage+ImageEffects
依赖于视图。我觉得不舒服,而且也不好看。所以我需要你们的想法:

  • 最好的方法是什么?我应该继续合并它们还是将它们作为单独的文件保存在各自的库中

  • 在一个项目中拥有同一类别的多个稍微不同的版本真的很重要吗?是否会引起任何问题/冲突

  • 我经常看到:

    类(NSZombie)操作系统(OS)调度(dispatch)组在这两个版本中都实现了吗??还有

    在我的控制台里。这是由上述事件引起的吗

  • 提前谢谢


    注意:我没有给这个问题起一个像“一个项目中同一类别的多个版本”这样的泛化名称,因为很多库都使用UIImage+ImageEffects来实现模糊效果,并且最有可能在您的项目中得到多个稍有不同的版本。回答2将把答案推到1(3听起来像是系统中的一个bug,您应该将其归档:):

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

    只要所有方法名称都是唯一的,那么除了系统类上的类别对于代码库的长期可维护性来说是可怕的问题之外,就没有其他问题了

    但是,如果这些类别都有相同名称的方法——它们很可能有相同名称的方法——那么将只使用其中一个方法,并且哪一个方法是不确定的

    因此,是的,您需要合并它们。或者,更好的办法是,通过将它们重构成一个助手类或其他东西来完全消除它们(然后针对原始代码库提交一个bug并让他们进行修改)。

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

    如果您只有一个构建目标并按源集成libs,那么只要重复的方法实现没有差异(即使这可能会导致大量链接器警告),一切都会正常工作


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

    我认为这不会产生任何问题,但当我对同一文件有重复的构建阶段条目时,警告信息会出现在我面前。第一段不正确;静态库所隐含的类别之间没有隔离。如果静态库A将方法
    -doThis
    添加到UIImage,而静态库B将方法
    -doThis
    添加到UIImage,则在运行时只有一个方法会出现,并且哪个方法不确定。感谢@bbum的更正,我相应地更新了我的帖子。