【问题标题】:Are methods declared in categories visible to other classes类别中声明的方法对其他类可见吗
【发布时间】:2015-04-12 21:21:28
【问题描述】:

假设我有以下内容

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'

但是,如果 SomeMethod 在 category 内的 .h 文件中声明,那么这可以正常工作。我想知道这是否是方法对其他类不可见的类别限制?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    其次,问题不在于方法是否在类、类别或类扩展中声明的可见性,而在于它是否在同一个翻译单元中声明。

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

    错误告诉您+SomeMethod 的声明未在翻译单元中声明。如果是,则无论是在类接口、类别还是类扩展中声明,都不会出错。

    因此,如果你在头文件中声明一个类别的接口,并在源文件中包含该头文件,你就可以在该源文件中使用该类别声明的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2012-11-23
      • 2015-03-13
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多