【问题标题】:Objective-C Categories not being recognized?Objective-C 类别不被识别?
【发布时间】:2012-08-26 14:39:04
【问题描述】:

嗯,这是一个很奇怪的问题。 (我只是希望这与我有一段时间没有玩那么多可可有关,否则......)

所以,这个问题很简单:

  • 我正在使用 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

#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

有什么想法吗?

【问题讨论】:

  • 类别的实现 (.m) 文件是否包含在目标的编译源构建阶段?这是我要检查的第一件事。
  • @AndrewMadsen 更新:不,实际上不是!天哪,我觉得自己很愚蠢。安德鲁,请将其作为正确答案发布(以便其他人也注意到),我会接受。非常感谢!
  • 这与以下问题相同:[Objective-C 类别导致无法识别的选择器][1] [1]:stackoverflow.com/questions/3998483/…

标签: objective-c cocoa unrecognized-selector objective-c-category


【解决方案1】:

将我的评论扩展为真正的答案:

确保类别的实现 (.m) 文件包含在目标的编译源构建阶段。导入标头足以告诉编译器 NSProgressIndicator 上有一个类别,它添加了一个 -start 方法。除非类别的实现被实际编译并链接到完成的二进制文件中(或者在运行时添加方法实现等),否则 NSProgressIndicator 不会在运行时实际响应start 消息。由于 Objective-C 的动态消息发送行为,编译器无法在编译时判断 NSProgressIndicator 是否实际上会响应该消息,这就是您没有收到警告的原因或错误。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2021-11-22
    相关资源
    最近更新 更多