今天早些时候,我尝试将单元测试添加到我正在创建的静态框架的 xcode 项目中。将单元测试目标添加到我的项目后,我能够成功运行单元测试模板并让测试捕获默认断言。然后,在将要测试的文件导入新的 SenTestCase 子类后,我尝试运行测试,但由于链接器错误,我的 UIColor 类别未能与测试一起构建。链接器错误的文本如下:
Undefined symbols for architecture i386:
"_CGColorGetComponents", referenced from:
-[UIColor(ColorExtension) hexValue] in StaticFramework(StaticFramework)
"_CGColorGetNumberOfComponents", referenced from:
-[UIColor(ColorExtension) hexValue] in StaticFramework(StaticFramework)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
接下来,我找到了这两个引用在我的项目中的位置。两者都属于我的类别,具有以下功能:
- (NSString *)hexValue
{
UIColor *color = self;
const size_t totalComponents = CGColorGetNumberOfComponents(color.CGColor);
const CGFloat * components = CGColorGetComponents(color.CGColor);
return [NSString stringWithFormat:@"#%02X%02X%02X",
(int)(255 * components[MIN(0,totalComponents-2)]),
(int)(255 * components[MIN(1,totalComponents-2)]),
(int)(255 * components[MIN(2,totalComponents-2)])];
}
如果我没记错的话,这两个都是 NSColor 类的一部分。通过更多检查,我还注意到在我的单元测试框架的文件夹中, UIKit.framework 和 Foundation.framework 都是红色的。我已经尝试重新导入它们并构建,但这也不能解决这个问题。
有趣的是,只要相关的测试没有运行,我的静态框架仍然可以正常构建和运行。当我注释掉这个函数时(以及每次我使用它),单元测试的构建没有问题。我的假设是否正确,即缺少 UIKit.framework 和 Foundation.framework 可能导致链接器找不到 NSColor 属性?有没有人有任何额外的建议可以解释为什么这些属性会导致这些问题或者我可以做些什么来解决它们?
任何帮助将不胜感激。感谢您的帮助。