Obj C 类文件有两个文件 .h 和 .m ,其中 .h 保存接口定义(@interface),.m 保存其实现(@implementation)
但是我在某些课程中看到 .h 和 .m 中都有一个@interface?
两个文件中的@interface 需要什么?有什么具体的理由这样做吗?如果这样做有什么好处?
Obj C 类文件有两个文件 .h 和 .m ,其中 .h 保存接口定义(@interface),.m 保存其实现(@implementation)
但是我在某些课程中看到 .h 和 .m 中都有一个@interface?
两个文件中的@interface 需要什么?有什么具体的理由这样做吗?如果这样做有什么好处?
.m文件中的 @interface 宏通常用于私有 iVar 和属性,以限制可见性。当然,这完全是可选的,但无疑是一种很好的做法。
.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 文件中声明这些类型的@interface
s 通常会使它们中声明的所有内容都公开。
但是您可以在 .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 文件中继承。
希望这可以帮助。
.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
如果我们想声明一些私有方法,那么我们在 .m 文件中使用 @interface 声明。