【问题标题】:Objective-C Method Call in Category Question类别问题中的 Objective-C 方法调用
【发布时间】:2011-09-08 15:36:12
【问题描述】:

我已经用一个类别扩展了我的一个类来处理解析特定的 XML 文件。 在 ListBuilder.m 类中,我定义了名为 newsloop 的方法,它在列表构建后简单地循环遍历项目列表。

-(void)newsloop;ListBuilder.m 内部声明的私有类别中声明。

在我的类别中,ListBuilder+XMLParser.m 是建立列表后我调用 newsloop 的地方:

-(void) parserDidEndDocument: (NSXMLParser *)parser {
    if ( [self.newslist count] >= 2 )
        [self newsloop];    // warning flagged here
    else
        // to some other default stuff
}

Xcode(4,如果重要的话)显示警告Method '-newsloop' not found (return type defaults to 'id')

为什么会引起警告,因为,如果我是对的,类别可以访问它们扩展的类中定义的所有方法。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    编译器仍然需要知道newsloop 方法(或选择器)存在。当它编译你的类别文件时,这个方法没有在任何地方声明,所以它会产生一个警告。

    如果您想将此方法保持为私有,您应该创建一个 ListBuilder+Private.h 文件,在其中声明任何共享私有方法,并将其包含在 ListBuilder.m 和您的 ListBuilder+XMLParser 类别中。

    从技术上讲,您的代码的用户可以自己包含标头并调用该方法,但无论如何还有其他方法可以做到这一点,因为在 Objective-C 中没有私有/公共方法之类的东西。此外,在其中包含一个带有“Private”的标题和调用方法是他们的问题,而不是你的问题。

    【讨论】:

      【解决方案2】:

      类不知道类中存在newsloop方法,因为它没有在头文件中声明;仅在私人类别中。这就是你收到警告的原因。您应该在头文件或类实现的协议中声明该方法。

      【讨论】:

      • 我读过的文档中没有提到那部分。可能是监督?
      • 并非所有情况都在文档中,但您可能使用头文件将类功能传达给这些类的用户。私有类别不在标头中,因此类实现文件之外的任何代码都不知道它。
      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多