首先:为什么obj-c项目的依赖管理如此痛苦?!
我在objective-c中为RESTful服务编写了一个包装器。服务器是一个简单的sinatra应用程序,在本地运行'http:// localhost:4567'。
我按照here概述的步骤添加了RestKit。
我知道RestKit正确地“安装”到我的项目中,因为当我#import <RestKit/RestKit.h>
时,项目构建得很好。
现在,我正在使用SenTesting.Framework测试我的库。我的主库中有一个类如下:
#import "CITWCore.h"
#import <RestKit/RestKit.h>
@implementation CITWCore
- (id)init
{
self = [super init];
if (self) {
RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:@"http://localhost:4567"];
// Initialization code here.
}
return self;
}
@end
我的单元测试班:
#import "CITWCoreTests.h"
@implementation CITWCoreTests
- (void)testItCreatesAnInstance
{
CITWCore *newCoreObject = [[CITWCore alloc]init];
STAssertNotNil(newCoreObject, @"new object should not be nil");
}
@end
当我使用⌘U运行测试时,测试失败并显示以下消息:
error: testExample (CITWCoreTests) failed: -[__NSCFString isIPAddress]: unrecognized selector sent to instance 0xa115880
错误由RKClient.m
中的第292行触发if ([newBaseURLString isEqualToString:@"localhost"] || [hostName isIPAddress]) {
RestKit项目中有一个名为“NSString + RestKit.h”的头文件,其中包含-isIPAddress方法声明,据我所知,它已被包含在内,所以我不知道为什么编译/运行-time不知道那个特定的方法。我配置测试目标的方式有问题吗?如何创建RKObjectManager的实例并让此测试通过?
更抽象地说:人们如何管理这样的依赖?我正在研究像VenderKit这样的东西,但它似乎缺乏文档,我认为我没有正确理解编译器和链接器如何工作以进行大抽象。将静态库链接到我的项目时有哪些一般准则,这个项目本身就是一个静态库?
答案 0 :(得分:3)
仔细检查“其他链接器标志”的项目构建设置是否在构建目标上具有“-all_load”和“-ObjC”。当你在那里时,检查你是否创建了“标题搜索路径”条目(“$(SOURCE_ROOT)/ RestKit”)。
您链接到的“Installing-RestKit-in-Xcode-4.x”页面略微过时了a)Xcode和b)RestKit HEAD(最近简化了构建过程.FMI查看邮件列表
如果你想看到项目正确设置(我最近刚创建它,使用最新的Xcode和Restkit),请查看https://github.com/lottadot/lottadot-restkit-ios-rails3-1-advanced
我的猜测是,如果你克隆该项目,编辑它的配置并删除“-all_load”,当你运行它时,你会看到完全相同的错误。
答案 1 :(得分:1)
在这种情况下,您需要找到定义/导出-[NSString isIPAddress]
的文件(或图像/库)。然后,您需要将该文件添加到编译阶段(如果它是源文件),或将库链接到最终二进制文件(如果它是库或目标文件)。除了将其链接到您的应用程序之外,您还需要编译并将其链接到您的单元测试可执行文件。
我知道RestKit正确地“安装”到我的项目中,因为当我执行#import时,项目构建得很好。
#import
不一定会链接或编译所有必需的依赖项。您可能必须手动执行此操作。 Xc4 可以自动检测依赖关系,并在启用该选项的情况下为您构建并链接它 - 但它总是使其正确(这对于基本依赖项是有益的)
为什么obj-c项目的依赖管理如此痛苦?!
真的不是,IMO。指定要编译的文件和要链接的库是编译C系列语言时需要习惯的。除非你想更具体地批评这个批评......
人们如何管理这样的依赖?
将依赖项目添加到Xcode项目中。将它们配置为构建依赖项 - 这将确保它们在构建应用程序之前构建,并且构建是最新的。对于静态库(以iOS为目标),请保存最终可执行文件的链接阶段。在更复杂的场景中,您将需要使用xcconfig文件,以便轻松定义任何/所有依赖项的构建设置。