* .m文件中的@interface关键字

时间:2014-07-30 19:05:17

标签: objective-c

我只是想知道:

之间是否有任何区别
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property ...
@end
* .h文件中的

和:

@interface AppDelegate()
@property ...
@end

@implementation AppDelegate
* .m文件中的

我什么时候需要首选版本以及何时使用第二版本?

5 个答案:

答案 0 :(得分:5)

您可以将任何内容放入.h文件中,然后放入.m文件中。导入的.h的内容在编译的早期阶段直接复制到.m中,因此根据语句的放置位置没有语法差异。

但是你会注意到

之间的语法差异
@interface AppDelegate : NSObject <NSApplicationDelegate>

@interface AppDelegate()

第二种形式是已经描述过的接口的扩展,而不是新的(和冲突的)版本。放在.m中的事实(这不是必需的 - 它可以放在.h中而不会引发错误)意味着导入.h的任何其他模块都不会“看到”它,使其成为“私有” “(与Objective-C中的任何内容都是私有的)。

答案 1 :(得分:4)

公众与私人

基本上, .h 文件是您的公共标头, .m 文件是您的实施 (的私有)。

您在 .m @interface中放置的内容将是私有(类别扩展名,不包括哪些内容),以及您的@interface in您的 .h 公开

如果我要使用segue将内容传递给UIViewController,或者如果我需要访问某个对象中的数据,我会将@properties放入 .h 中。否则我只是将所有内容都放在私有类扩展中( .m )。不过,您只能在 .h 文件中使用@properties

答案 2 :(得分:2)

代码:

@interface AppDelegate()
@property ...
@end

创建一个私有类扩展,无法从类实现文件外部看到它,使其成为私有,而不是头文件中 public 。< / p>

考虑到Objective-C的动态特性,一旦你压制了编译器警告,它仍然可以从其他类调用私有属性。

它也可用于声明私有方法,我使用_作为前缀,以区别于公共方法,但不要求这样做。

@interface AppDelegate()
- (BOOL)_doCoolThing;
@end

你甚至不必声明私有方法,因为只要定义编译器就可以正常工作,但我总是同时声明和定义它们。

答案 3 :(得分:2)

一般来说,您使用头文件(.h)中的@interface来声明 public 属性和方法,这些属性和方法对于导入此类的其他类都是可见的。

实现文件(.m)中的@interface用于声明私有属性和方法,这些属性和方法仅在该类中可见,并且不能被其他类使用或访问在你的项目中。

答案 4 :(得分:1)

您的代码之间的差异在于您在第一个变体中使用扩展(内部的所有方法仅用于@implementation)

<。>文件中的

@interface ClassName() {
//methods here
}
@end
@implementation ClassName
//method implementation from ClassName() and from .h file for ClassName
@end

在第二个类的实现中 - 你在.h中声明的所有方法都像public

有关您可以找到here

的扩展程序的详细信息

有关课程的更多信息 - here

有关属性的信息 - here