Objective-C类别未被识别?

Dr.*_*eon 1 cocoa objective-c unrecognized-selector objective-c-category

嗯,这是一个非常奇怪的问题.(我只是希望它与我不玩的时间有关 - 可以和Cocoa一起玩,或者......)

所以,问题非常简单:

  • 我正在使用Xcode 4.3.3(一个非常简单的测试项目--10.7 SDK - 没有ARC)
  • 我在某些类上创建了一个类别(例如NSProgressIndicator)
  • 我包含了相应的头文件
  • 当我尝试使用我的任何类别的方法时(但它仍显示在可用命令的下拉列表中),我收到一个错误:

[NSProgressIndicator start]:无法识别的选择器发送到实例0x7f9f4b91a0a0

代码

(作为一个例子 - 它发生在其他(100次测试)类别):

#import <Foundation/Foundation.h>


@interface NSProgressIndicator (NSProgressIndicator_Functions)

- (void)start;
- (void)stop;

@end
Run Code Online (Sandbox Code Playgroud)
#import "NSProgressIndicator+Functions.h"


@implementation NSProgressIndicator (NSProgressIndicator_Functions)

- (void)start
{
    [self setHidden:NO];
    [self startAnimation:nil];
}

- (void)stop
{
    [self setHidden:YES];
    [self stopAnimation:nil];
}

@end
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

And*_*sen 5

将我的评论扩展为一个真实的答案:

确保类别的实现(.m)文件包含在目标的编译源构建阶段中.导入标题足以告诉编译器NSProgressIndicator上有一个类别,它添加了一个-start方法.除非类的实现实际上是编译和链接到最终的二进制文件(或方法的实现在运行时添加,等等),NSProgressIndicator实际上不会给响应start消息在运行时.由于Objective-C的动态消息发送行为,编译器无法在编译时告诉NSProgressIndicator是否实际上要响应该消息,这就是为什么你没有收到警告或错误.