First off: Why is dependency management for obj-c projects such a pain?!
I am writing a wrapper for my RESTful service in objective-c. The server is a simple sinatra app running locally on ‘http://localhost:4567’.
I’ve included RestKit by following the steps outlined here.
I know RestKit is ‘installed’ correctly into my project because when I do #import <RestKit/RestKit.h> the project builds just fine.
Now, I’m testing my library using SenTesting.Framework. I have a class in my main library that looks like this:
#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
And my unit test class:
#import "CITWCoreTests.h"
@implementation CITWCoreTests
- (void)testItCreatesAnInstance
{
CITWCore *newCoreObject = [[CITWCore alloc]init];
STAssertNotNil(newCoreObject, @"new object should not be nil");
}
@end
When I run the tests using ⌘U the test fails with this message:
error: testExample (CITWCoreTests) failed: -[__NSCFString isIPAddress]: unrecognized selector sent to instance 0xa115880
The error is being triggered by line 292 in RKClient.m
if ([newBaseURLString isEqualToString:@"localhost"] || [hostName isIPAddress]) {
There is a header file in the RestKit project called “NSString+RestKit.h” which contains the -isIPAddress method declaration, and as far as I can tell it is getting included, so I have no idea why the compiler/run-time does not know about that particular method. Is there something wrong with the way I’ve configured my testing target? How can I create an instance of RKObjectManager and get this test to pass?
More abstractly: How are people managing dependencies like this? I’m looking at things like VenderKit, but it seems lacking in documentation and I don’t think I have the proper understanding of how compilers and linkers work to go to that big of an abstraction. What are some general guidelines when linking static libraries into my project, which is itself a static library?
Double check that your project build settings for “Other Linker Flags” has “-all_load” and “-ObjC” on your build target. While you are in there, check that you created the “Header Search Paths” entry (“$(SOURCE_ROOT)/RestKit”).
The “Installing-RestKit-in-Xcode-4.x” page that you linked to, is slightly out of date with a) Xcode and b) RestKit HEAD (the build process was simplified recently. FMI see the mailing list.
If you want to see a project correctly setup (I just created it recently, with the newest Xcode and Restkit) take a look at https://github.com/lottadot/lottadot-restkit-ios-rails3-1-advanced
My guess is if you clone that project, edit it’s configuration and remove “-all_load” you will see the exact same error, when you run it.