关于iphone:Obj-C“@interface”的类文件?

Class files of Obj-C “@interface”?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between @interface definition in .h and .m file

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

但我在一些类中看到.h和.m中都有@interface?

两个文件中对@interface的需求是什么?有什么具体的原因吗?如果这样做有什么好处呢?


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

1
   @interface theMainInterface : NSObject

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

1
   @interface theMainInterface(MyNewCatergory)

这意味着你可以在一个.h文件中有多个@interface,比如

1
2
3
4
5
6
7
8
9
10
11
   @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文件中声明这些类型的@interface通常会公开其中声明的所有内容。

但是您可以在.m文件中声明private @interface,这将执行以下三项操作之一:私人扩展选定的@interface,或向选定的@interface添加新类别,或声明新的private @interface

您可以通过向.m文件中添加类似的内容来完成此操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  @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

我不确定你能否继承.m文件中的@interface

希望这有帮助。


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


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

1
2
3
@interface ClassName (CategoryName)

@end

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

1
2
3
@interface ClassName ()

@end

还请注意,在私有类别中,可能有一个属性声明为readwrite,在头中声明为readonly。如果这两个声明都是读写的,编译器会抱怨。

1
2
3
4
5
6
7
8
9
// .h file
@interface ClassName
@property (nonatomic, strong, readonly) id aProperty;
@end

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

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