我正在引用另一个项目的目标静态库。我成功地跟踪了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文件。我没有看到实例属性。
有关我做错的任何建议吗?
答案 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。