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



我只是想知道是否有什么不同:

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property ...
@end
*.h文件中的

和:

@interface AppDelegate()
@property ...
@end
@implementation AppDelegate
*中的

。m文件。

什么时候我需要使用第一个版本,什么时候使用第二个版本会更好?

任何可以放在。h文件中的内容都可以放在。m文件中。在编译的早期阶段,导入的.h的内容直接复制到.m中,因此不存在基于语句放置位置的语法差异。

但是你会注意到在语法上是不同的
@interface AppDelegate : NSObject <NSApplicationDelegate>

@interface AppDelegate()
第二种形式是已经描述的接口的扩展,而不是一个新的(和冲突的)版本。事实上,它被放置在。m中(这不是必需的——它可以被放置在。h中而不会引发错误)意味着任何其他导入。h的模块都不会"看到"它,使其成为"私有"(就像Objective-C中的任何东西都是私有的一样)。

公共与私人

基本上,.h文件是您的公共头文件,以及您的。m文件是您的实现 (private)。

无论你在中的@interface是什么。m将是private(类扩展等),并且您的.h中的@interfacepublic

如果我要通过一个segue传递东西给UIViewController,或者如果我需要访问一些对象中的数据,我会把我的@properties在我的.h。否则,我只是把所有东西放在私有类扩展(.m)。您可以只在.h文件中使用@properties

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

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

代码:

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

创建一个不能从类实现文件外部看到的私有类扩展,使其私有,而不是头文件中的公共

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

对于声明私有方法也很有用,我用_作为前缀来区分它们与公共方法,尽管没有必要这样做。

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

你甚至不需要声明私有方法,因为编译器只需要定义就可以很好地工作,但是我总是既声明又定义它们。

你的代码之间的区别是,在第一个变体中,你使用扩展(内部的所有方法只用于下面的@implementation使用)

in .m file

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

,其次是它的类实现-你在。h中声明的所有方法都像公共

关于扩展的更多细节可以在这里找到

更多关于类的信息-在这里

属性信息-这里

最新更新