假设我有以下
FileName : DBManager.h
#import <Foundation/Foundation.h>
@interface DBManager : NSObject
//Notice no method is declared here
@end
现在它的实现文件看起来像这样
FileName: DBManager.m
#import "DBManager.h"
@interface DBManager()
+ (DBManager*) SomeMethod;
@end
@implementation DBManager
+ (DBManager*) SomeMethod
{
....
return SomePtr;
}
@end
现在在其他一些类方法中,如果我执行以下操作
[DBManager SomeMethod] ; //Error No known class method for selector 'SomeMethod'
但是,如果在类别内的.h文件中声明了SomeMethod
,那么这样可以正常工作。我想知道这是否是类别的限制,这些方法对其他类是不可见的?
答案 0 :(得分:2)
首先,@interface DBManager()
不是类别,而是类扩展。括号之间没有标识符。
其次,根据方法是在类,类别还是类扩展中声明,问题是不可见,它是否在同一个翻译单元中声明。
翻译单元是预处理器包含/导入头文件(或其他任何已包含/导入的文件)之后的源文件。
错误告诉您+SomeMethod
的声明未在翻译单元中声明。如果是,那么无论是否在类接口,类别或类扩展中声明它都没有错误。
如果您在头文件中声明类别的接口并在源文件中包含头文件,则可以使用该源文件中该类别声明的方法。