Cocoa 类别及;可可中的辛格尔顿

Cocoa 类别及;可可中的辛格尔顿,cocoa,xcode,singleton,categories,Cocoa,Xcode,Singleton,Categories,我有一个SingletonClass,它只有一个实例。我想扩展它并添加一个类别(更多功能) 我创建了一个源SingletonClass+MoreFeatures,其接口/实现如下所示: @interface SingletonClass (MoreFeatures) - (void) feature; @end @implementation SingletonClass (MoreFeatures) - (void) feature { } @end 当我创建我的Singleton类时

我有一个SingletonClass,它只有一个实例。我想扩展它并添加一个类别(更多功能)

我创建了一个源SingletonClass+MoreFeatures,其接口/实现如下所示:

@interface SingletonClass (MoreFeatures)

- (void) feature;

@end

@implementation SingletonClass (MoreFeatures)
- (void) feature
{
}
@end
当我创建我的Singleton类时,我遵循了苹果在cocoa中实现Singleton的例子

此单例驻留在项目B中,它是更大项目a的依赖项。 我可以从项目a中的源代码调用
[[SingletonClass sharedInstance]foo]
,如果函数foo位于SingletonClass接口/实现中,它就会起作用。当我试图从项目a中的源代码调用
[[SingletonClass sharedInstance]功能]
时,我遇到了一个崩溃,这表示SingletonClass没有方法功能

为什么会这样

非常感谢

纳瓦


编辑:崩溃发生在运行时。类别文件源与SingletonClass一起驻留在项目B中。听起来,在构建项目a时,您的类别实现没有被编译。这类事情绝对是可能的,Foundation/AppKit/UIKit大量使用类别将大型类拆分到多个文件中


您没有明确说明您的项目B是如何包含在项目A中的。如果它是一个框架、共享或静态库,那么请确保您的类别文件包含在项目B的“编译源代码”构建阶段。如果它作为源代码包含,请确保将该文件编译为项目A构建的一部分。

您需要为项目指定-all_load和-ObjC链接器标志

希望这有帮助,
Moszi

您是指编译器崩溃还是运行时崩溃?您的类别在哪里?是在项目a上还是在项目B上?运行时崩溃。该类别位于项目B中,其中是主类所在的位置。我很惊讶您的代码竟然可以编译。实现中“feature”后面的括号是多余的。@JeremyP编译真正的代码。问题中有一个拼写错误。当然,我带来的代码只是为了演示问题,不是真正的代码,但问题已经解决了。请看我自己的答案。谢谢你的帮助。我查过了。项目B是一个静态库,categories类包含在编译源代码构建阶段。项目A链接到B静态库,但是来自B的源不包括在项目A的构建阶段。当我想使用它的函数时,我在项目A的源文件中导入SingletonClass+MoreFeatures.h的.h文件。@Nava那么如果在静态库上运行
类转储
,它会找到你的类别吗?听起来是个很棒的工具,但由于某些原因,我无法使用这个库运行它。这个库是静态的。一个arm6、arm7架构的库。尝试运行./class dump libiProjectB.a会给出一条消息:输入文件(libiProjectB.a)既不是Mach-O文件,也不是fat存档。但我对它运行了一个nm命令,它将SingletonObject(MoreFeatures)视为SingletonObject的一个类别。我在project A(另一个带有类别的单例对象)中的情况与此完全相同,它工作得非常完美。谢谢,昨天我在这个问题上给出了我自己的答案,并链接到一个类似的SO问题,其中包含一个指向苹果公司技术问答的链接,其中详细解释了这个问题。顺便说一句,该标志称为-all_load或-force_load。请修改你的答案,我会检查它是否正确