在类别中声明的方法是否对其他类可见

时间:2015-04-12 21:21:29

标签: objective-c

假设我有以下

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,那么这样可以正常工作。我想知道这是否是类别的限制,这些方法对其他类是不可见的?

1 个答案:

答案 0 :(得分:2)

首先,@interface DBManager()不是类别,而是类扩展。括号之间没有标识符。

其次,根据方法是在类,类别还是类扩展中声明,问题是不可见,它是否在同一个翻译单元中声明。

翻译单元是预处理器包含/导入头文件(或其他任何已包含/导入的文件)之后的源文件。

错误告诉您+SomeMethod的声明未在翻译单元中声明。如果是,那么无论是否在类接口,类别或类扩展中声明它都没有错误。

如果您在头文件中声明类别的接口并在源文件中包含头文件,则可以使用该源文件中该类别声明的方法。