【问题标题】:Why is there @interface above @implementation?为什么@implementation 上面有@interface?
【发布时间】:2012-07-20 14:50:02
【问题描述】:

我想知道为什么有两次@interface。一个在class.h,另一个在class.m。例如:

TestTableViewController.h:

#import <UIKit/UIKit.h>

@interface TestTableViewController : UITableViewController

@end

和(自动生成)class.m 我发现:

#import "TestTableViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController

... methods delegated from UITable delegates

@end

所以我的问题是,.m 文件中的@interface TestTableViewController () 是关于什么的。为什么它在那里?我需要吗?

提前致谢

【问题讨论】:

标签: objective-c ios xcode ios5 xcode4.4


【解决方案1】:

第二个@interface 指令在实现文件(.m)中——你可以从中推断出它是用来声明类的创建者不想暴露给类的用户的东西。这通常意味着私有和/或内部方法和属性。另请注意,这样做有两种类型。一个(您在此处看到)称为“类扩展”,它由一对空括号表示:

@interface MyClass ()

这一点特别重要,因为您可以使用它向您的类添加额外的实例变量。

第二个,称为“类别”,由一对非空括号表示,包含类别名称,如下所示:

@interface MyClass (CategoryName)

它也用于扩展类。您不能使用类别将实例变量添加到一个类中,但您可以为同一个类有多个类别,这就是它主要用于扩展您没有源代码的系统/框架类的原因——所以从这个意义上说,类别与类扩展完全相反。

【讨论】:

    【解决方案2】:

    第二个“接口”定义了“TestTableViewController”类的扩展,对于只导入 h 文件的人是不可见的。这是在目标 C 中创建私有方法的实际方式。

    【讨论】:

    • 不,它不是一个类别,它是一个类扩展。 -1.
    • 对-1不太好。类别和扩展之间的区别主要是语义上的:扩展基本上是一个匿名类别,要求它在类的主要实现块中实现。因此,在第二个“接口”块的括号中设置一个名称,将有效地创建一个类别,而不是一个扩展......
    【解决方案3】:

    在那里你可以声明你只想在你的类中使用的私有方法和属性,而不是暴露给其他类。

    【讨论】:

      【解决方案4】:

      TestTableViewController.h 文件中的接口是类扩展的声明。有 2 个圆括号显示了这一点。语法与为类编写类别相同。但在这种情况下,它用于声明作者不想在头文件中公开的某种私有方法

      一个普通的分类界面是这样的:

      @interface TestTableViewController (Your_Category_Name)
      - (void)doSomething;
      @end
      

      以及对应的实现:

      @implementation TestTableViewController (Your_Category_Name)
      -(void)doSomething {
      // Does something...
      }
      @end
      

      在您的示例中,没有指定类别名称,因此它只是扩展了类,您可以在正常实现中实现该方法。

      通常这种技术用于“隐藏”方法。它们没有在头文件中声明,如果只导入 .h 文件,它们是不可见的。

      【讨论】:

      • 除了声明私有方法和分类代码之外,使用类别是否有用?
      • 谢谢你告诉我。我现在没有这被称为类扩展。到目前为止,我只是将其视为一个类别。我会解决的。
      • 即使没有名字,还是不扩展类?那么我们如何添加实例变量呢?
      • 您需要使用 ObjC 运行时。看看这个答案:stackoverflow.com/a/13757149/262534
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多