如何引用静态库的属性

时间:2009-04-02 03:16:50

标签: iphone objective-c xcode

我正在引用另一个项目的目标静态库。我成功地跟踪了instructions from this site。下面是使用库中名为FileIO的类的项目。

我创建一个FileIO对象并为其name属性分配一个字符串。然后我在名字的分配上得到__TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__

applicationDidFinishLaunching我这样做:

fileObj = [[FileIO alloc] init];
fileObj.name = @"test";

,这是在.h文件中:

@class FileIO;

@interface Nav1AppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;
    FileIO *fileObj;
}

在库中,FileIO是一个带有名称的简单类。我也尝试了[fileObj setName:@"test"],但得到了相同的结果。这是堆栈跟踪:

2009-04-01 20:37:17.721 NavNew[81425:20b] *** -[FileIO setName:]: unrecognized selector sent to instance 0x5219b0

2009-04-01 20:37:17.723 NavNew[81425:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[FileIO setName:]: unrecognized selector sent to instance 0x5219b0'

2009-04-01 20:37:17.724 NavNew[81425:20b] Stack: (

    2454561035,
    2461146683,
    2454590218,
    2454583564,
    2454583762,
    11275,
    816111650,
    816149355,
    2455110190,
    2454063909,
    2454064344,
    827745792,
    827745989,
    816114848,
    816160924,
    11128,
    10982
)
(gdb) 

我发现这只是实例成员(属性或方法)的问题。静态方法工作正常。我还在托管项目中打开了库.a文件。我没有看到实例属性。

有关我做错的任何建议吗?

2 个答案:

答案 0 :(得分:1)

在您曾经“导入”静态库的instructions中,作者描述了几个随机发生的奇怪错误的情况,这就是为什么我建议采用不同的方法:使用Xcode跨项目参考和共享构建输出目录。以下是带有屏幕截图的教程的链接:http://www.clintharris.net/2009/iphone-app-shared-libraries/

我已经使用这个策略几个月了多个项目和静态库 - 它很棒,我没有遇到任何问题。另一个非常好的特权是你使用Xcode环境变量来引用带有静态库的项目(包括头文件);如果你有多个开发人员在同一个项目上工作,需要移动目录等,这使得解决方案非常灵活。

答案 1 :(得分:0)

由于某种原因,您拥有的FileIO对象没有响应setName:消息,因此当您尝试发送该消息时它会抛出NSInvalidArgumentException。我最好的猜测是由于某种原因共享库没有正确加载,因此setName:的实现没有被加载,因此运行时混淆并认为setName:未实现

我不确定如何解决此问题,但看起来[[FileIO alloc] init]似乎成功(或者至少到了不抛出异常的程度),所以至少有些东西在起作用。要获取允许的消息列表,您可以尝试以下操作:

unsigned int methodCount;
Method *methods = class_copyMethodList(object_getClass(fileObj), &methodCount);
for(unsigned int i = 0; i < methodCount; i++)
    NSLog(@"Method %u: %s", i, sel_getName(method_getName(methods[i])));
free(methods);

有关各种Objective-C运行时方法的信息,请参阅Objective-C 2.0 Runtime Reference