一个项目中的多个 UIImage+ImageEffects 文件
multiple UIImage+ImageEffects files in one project
我的 iOS 项目中有几个第三方库(不使用 cocoapods),当我深入研究每个库的文件时,我发现其中 4 个库有自己的 UIImage+ImageEffects
类别版本。所以我打算将它们合并到一个文件中,但这有点混乱:
例如,其中一个库 SCLAlertView 在 its version of UIImage+ImageEffects
中有一个自定义方法,它引用回 SCLAlertView[=42] 之一=] classes 访问一个变量。因此,如果我将那个 class 导入到合并的文件中,它将使新的 UIImage+ImageEffects
依赖于 SCLAlertView。我对此感到不舒服,而且它不漂亮。所以我需要你们对此的想法:
解决此问题的最佳方法是什么?我应该继续合并它们还是将它们作为单独的文件保存在各自的库中?
项目中同一类别的多个略有不同的版本真的很重要吗?它会产生任何 issues/conflicts?
我经常看到这个:
Class _NSZombie_OS_dispatch_group is implemented in both ?? and ?? ...
在我的控制台中。这是不是由上面的事情引起的?
提前致谢。
注意:我没有给这个问题起一个像 "multiple versions of same category in one project" 这样的通用名称,因为 UIImage+ImageEffects
被许多库用于模糊效果并且最有可能最终成为您的项目中有多个略有不同的版本
回答 2 会将答案推向 1(而 3 听起来像是系统中的错误,您应该提交它:)):
项目中同一类别的多个略有不同的版本真的很重要吗?它会产生任何 issues/conflicts?
只要所有方法名称都是唯一的,除了系统 classes 上的类别从长远来看很糟糕的问题之外没有问题代码库的可维护性。
但是,如果所有类别都有同名的方法(它们很可能会这样做),那么将只使用其中一个,并且不确定使用哪个。
因此,是的,您需要合并它们。或者,更好的是,通过将它们重构为帮助程序 class 或其他东西来完全消除它们(然后针对原始代码库提交错误并让他们提取更改)。
如果您将第 3 方库构建并集成为静态库,则每个库都是独立的并使用其自己的类别版本,并且一切正常。在这种情况下,您应该将类别保留在库内部,并避免通过 public headers. 中的 #include
公开它们编辑: 正如 bbum 所指出的,类别方法在其包含的静态库中是 not 隔离的;将库包装为静态库不会解决 OP 的问题。
如果您只有一个构建目标并按源代码集成库,只要重复的方法实现没有差异,事情就可以正常进行(即使这可能会导致很多链接器警告)。
如果类别实现不同,则会出现问题,因为结果行为(即在运行时使用哪个类别方法)是未定义的(参见 this post)。在这种情况下,我不知道 好的 问题解决方案; 不好(但有效)解决方案是重命名(前缀)每个库类别中的方法,并在各自的库中使用重命名的方法。例如。在库 A 中,您可以将 imageByApplyingLightEffectToImage:
重命名为 a_imageByApplyingLightEffectToImage:
并相应地更改 A 中对该方法的所有调用。正如我所说,我只会将此方法用作最后的手段。
我的 iOS 项目中有几个第三方库(不使用 cocoapods),当我深入研究每个库的文件时,我发现其中 4 个库有自己的 UIImage+ImageEffects
类别版本。所以我打算将它们合并到一个文件中,但这有点混乱:
例如,其中一个库 SCLAlertView 在 its version of UIImage+ImageEffects
中有一个自定义方法,它引用回 SCLAlertView[=42] 之一=] classes 访问一个变量。因此,如果我将那个 class 导入到合并的文件中,它将使新的 UIImage+ImageEffects
依赖于 SCLAlertView。我对此感到不舒服,而且它不漂亮。所以我需要你们对此的想法:
解决此问题的最佳方法是什么?我应该继续合并它们还是将它们作为单独的文件保存在各自的库中?
项目中同一类别的多个略有不同的版本真的很重要吗?它会产生任何 issues/conflicts?
我经常看到这个:
Class _NSZombie_OS_dispatch_group is implemented in both ?? and ?? ...
在我的控制台中。这是不是由上面的事情引起的?
提前致谢。
注意:我没有给这个问题起一个像 "multiple versions of same category in one project" 这样的通用名称,因为 UIImage+ImageEffects
被许多库用于模糊效果并且最有可能最终成为您的项目中有多个略有不同的版本
回答 2 会将答案推向 1(而 3 听起来像是系统中的错误,您应该提交它:)):
项目中同一类别的多个略有不同的版本真的很重要吗?它会产生任何 issues/conflicts?
只要所有方法名称都是唯一的,除了系统 classes 上的类别从长远来看很糟糕的问题之外没有问题代码库的可维护性。
但是,如果所有类别都有同名的方法(它们很可能会这样做),那么将只使用其中一个,并且不确定使用哪个。
因此,是的,您需要合并它们。或者,更好的是,通过将它们重构为帮助程序 class 或其他东西来完全消除它们(然后针对原始代码库提交错误并让他们提取更改)。
如果您将第 3 方库构建并集成为静态库,则每个库都是独立的并使用其自己的类别版本,并且一切正常。在这种情况下,您应该将类别保留在库内部,并避免通过 public headers. 中的 #include
公开它们编辑: 正如 bbum 所指出的,类别方法在其包含的静态库中是 not 隔离的;将库包装为静态库不会解决 OP 的问题。
如果您只有一个构建目标并按源代码集成库,只要重复的方法实现没有差异,事情就可以正常进行(即使这可能会导致很多链接器警告)。
如果类别实现不同,则会出现问题,因为结果行为(即在运行时使用哪个类别方法)是未定义的(参见 this post)。在这种情况下,我不知道 好的 问题解决方案; 不好(但有效)解决方案是重命名(前缀)每个库类别中的方法,并在各自的库中使用重命名的方法。例如。在库 A 中,您可以将 imageByApplyingLightEffectToImage:
重命名为 a_imageByApplyingLightEffectToImage:
并相应地更改 A 中对该方法的所有调用。正如我所说,我只会将此方法用作最后的手段。