Objective-C类别导入奇怪的行为

时间:2009-07-08 17:49:04

标签: objective-c inheritance import categories

我正在从外部库扩展一个类。这是我的代码:

头文件: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 **”,它正常工作。

任何人都可以解释我忘了什么?感谢

4 个答案:

答案 0 :(得分:4)

我怀疑您忘记将Manager + MyCategory.m添加到Xcode中的approrpriate目标。您没有收到链接器错误,因为所有符号都存在且没有编译器警告,因为您已包含相应的头文件,但在运行时缺少elementWithTag:方法的实现。

答案 1 :(得分:1)

类别与传统的Unix 静态库不兼容。

如果是这种情况,似乎将-ObjC选项传递给链接器可以解决问题。

Apple Technical Q&A QA1490解释了这一切。

答案 2 :(得分:0)

道歉,无法将其添加为评论......

仅用于测试,您可能希望添加在标头中声明并在.m文件中实现的extern c函数。如果在测试代码中调用此c函数,则由于未解析的标识符,此生成链接器错误。

这可以更容易地调查问题,因为它提供了即时反馈,并可能产生一些额外的线索,说明文件未被包含的原因。

考虑到时间范围,我会假设你已经完成了这个,但为了以防万一......确保你已清理目标,关闭XCode,然后重新打开。我已经让项目文件在内存中被破坏并且行为异常。

巴尼

答案 3 :(得分:0)

升级到Xcode 4时出现此问题。

要解决这个问题,我必须将我的类别定义分成单独的.m和.h - Xcode 3似乎没什么问题,实现和接口都在.h ...但是哦,没有挑剔的Xcode 4是肛门。< / p>