iOS库的依赖管理

时间:2011-12-31 21:16:02

标签: objective-c ios xcode restkit

首先:为什么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这样的东西,但它似乎缺乏文档,我认为我没有正确理解编译器和链接器如何工作以进行大抽象。将静态库链接到我的项目时有哪些一般准则,这个项目本身就是一个静态库?

2 个答案:

答案 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文件,以便轻松定义任何/所有依赖项的构建设置。