我正在从外部库扩展一个类。这是我的代码:
头文件:Manager + MyCategory.h
#import "Manager.h"
#import "Element.h"
@interface Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag;
@end
实施文件:Manager + MyCategory.h文件
@implementation Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag {
...
}
@end
现在我将使用此类别:
#import "Manager+MyCategory.h"
@implementation myClass
- (void) myFunction:(NSInteger)tag {
Manager* myManager = [[Manager alloc] init];
Element* = [myManager elementWithTag:tag];
...
[myManager release];
}
@end
编译时我没有警告但是当我运行程序时出现以下错误:
*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:
正确导入了头文件(即Manager + MyCategory.h),但看起来没有完成与实现文件的链接。 如果我在我的课程中用#import“Manager + MyCategory **。m **”替换#import“Manager + MyCategory **。h **”,它正常工作。
任何人都可以解释我忘了什么?感谢
答案 0 :(得分:4)
我怀疑您忘记将Manager + MyCategory.m添加到Xcode中的approrpriate目标。您没有收到链接器错误,因为所有符号都存在且没有编译器警告,因为您已包含相应的头文件,但在运行时缺少elementWithTag:
方法的实现。
答案 1 :(得分:1)
答案 2 :(得分:0)
道歉,无法将其添加为评论......
仅用于测试,您可能希望添加在标头中声明并在.m文件中实现的extern c函数。如果在测试代码中调用此c函数,则由于未解析的标识符,此将生成链接器错误。
这可以更容易地调查问题,因为它提供了即时反馈,并可能产生一些额外的线索,说明文件未被包含的原因。
考虑到时间范围,我会假设你已经完成了这个,但为了以防万一......确保你已清理目标,关闭XCode,然后重新打开。我已经让项目文件在内存中被破坏并且行为异常。
巴尼
答案 3 :(得分:0)
升级到Xcode 4时出现此问题。
要解决这个问题,我必须将我的类别定义分成单独的.m和.h - Xcode 3似乎没什么问题,实现和接口都在.h ...但是哦,没有挑剔的Xcode 4是肛门。< / p>