草庐IT

objective-c - iOS 库的依赖管理

coder 2024-01-11 原文

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

最佳答案

仔细检查“其他链接器标志”的项目build设置是否在构建目标上具有“-all_load”和“-ObjC”。当您在那里时,检查您是否创建了“Header Search Paths”条目(“$(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”,您将在运行时看到完全相同的错误。

关于objective-c - iOS 库的依赖管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690600/

有关objective-c - iOS 库的依赖管理的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  3. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  8. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  9. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  10. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

随机推荐