1

可能重复:
.h 和 .m 文件中的@interface 定义之间的差异

Obj C 类文件有两个文件 .h 和 .m ,其中 .h 保存接口定义(@interface),.m 保存其实现(@implementation)

但是我在某些课程中看到 .h 和 .m 中都有一个@interface?

两个文件中的@interface 需要什么?有什么具体的理由这样做吗?如果这样做有什么好处?

4

4 回答 4

2

.m文件中的 @interface 宏通常用于私有 iVar 和属性,以限制可见性。当然,这完全是可选的,但无疑是一种很好的做法。

于 2012-09-04T09:54:39.153 回答
2

.h 文件中的@interface通常是公共接口,这是您要声明继承的接口,例如

   @interface theMainInterface : NSObject

注意冒号:,然后@interface是继承自的超级对象NSObject,我相信这只能在 .h 文件中完成。您还可以@interface使用类别声明,例如

   @interface theMainInterface(MyNewCatergory)

所以这意味着您可以@interface在一个 .h 文件中包含多个 s,例如

   @interface theMainInterface : NSObject

        // What ever you want to declare can go in here. 

   @end

   @interface theMainInterface(MyNewCategory)

        // Lets declare some more in here.

   @end

在 .h 文件中声明这些类型的@interfaces 通常会使它们中声明的所有内容都公开。

但是您可以在 .m 文件中声明 private @interface,这将执行以下三件事之一,它将私下扩展所选内容@interface或将新类别添加到所选内容@interface或声明新的私有@interface

您可以通过在 .m 文件中添加类似的内容来做到这一点。

  @interface theMainInterface()
      // This is used to extend theMainInterface that we set in the .h file.
      // This will use the same @implemenation
  @end

  @implemenation theMainInterface()
      // The main implementation.
  @end

  @interface theMainInterface(SomeOtherNewCategory)
      // This adds a new category to theMainInterface we will need another @implementation for this.
  @end 

  @implementation theMainInterface(SomeOtherNewCategory)
      // This is a private category added the .m file
  @end

  @interface theSecondInterface()
      // This is a whole new @interface that we have created, this is private
  @end

  @implementation theSecondInterface()
     // The private implementation to theSecondInterface
  @end

这些都以相同的方式工作,唯一的区别是有些是private,有些是public,有些是categories

我不确定您是否可以@interface在 .m 文件中继承。

希望这可以帮助。

于 2012-09-04T11:16:11.163 回答
1

.m 文件中出现的@interface 通常用于内部类别定义。将有一个类别名称后跟@interface 语句,格式如下

@interface ClassName (CategoryName)

@end

当类别名称为空时,如下格式,其中的属性和方法被认为是私有的。

@interface ClassName ()

@end

另请注意,您可能在私有类别中声明为 readwrite 并在标题中声明为 readonly 的属性。如果两个声明都是可读写的,编译器会报错。

// .h file
@interface ClassName
@property (nonatomic, strong, readonly) id aProperty;
@end

// .m file
@interface ClassName()
@property (nonatomic, strong) id aProperty;
@end
于 2012-09-04T10:54:53.400 回答
1

如果我们想声明一些私有方法,那么我们在 .m 文件中使用 @interface 声明。

于 2012-09-04T10:07:04.070 回答