在实现文件中声明接口(Objective-C)

4

在最新版本的xCode(4.3)中,我发现了预定义模板(例如Master/Detail模板),其中界面声明是在.m文件中完成的。例如,在文件MyFile.h中有:

@interface MyFile

@property (nonatomic, retain) NSString *someProp;

@end

在 MyFile.m 文件中有以下内容:
@implementation MyFile

@interface MyFile {
    NSString * anotherProp;
}

- (id) init...

为什么要这样制作?为什么MyFile.h文件中没有声明anotherProp?

提前致谢。


1
那并不是它的真实样子,因为那是无效的代码。可能是这样的:@interface MyFile () { NSString * anotherPropt } @end @implementation MyFile - (id) init {...如果是这种情况,请参考:https://dev59.com/rmkw5IYBdhLWcg3woMFD - jscs
你说得对,我是凭记忆发布的,忘记加括号了。 - rai212
1个回答

5

虽然它不是这样声明的,但是它是这样声明的:

@interface ClassName() {

    Declarations;

}

Methods;

@end

这些被称为类扩展。它们类似于分类,但只能在类的实现中声明,而不能在任何其他类中声明。使用扩展的目的是重新声明公共或读写属性,并在需要时声明新属性。它们允许您在@interface之外的地方声明属性和变量,因此名为“extensions”。
它的引入是为了解决分类的问题,因为它们使方法公开,而类的数据隐藏能力受到影响,但是类扩展有效地扩展了类的主要接口,其中声明的方法具有与类的常规公共主要接口中声明的方法相同的要求。

你说得对,我忘记加括号了。谢谢你的解释,我现在明白了。 - rai212
1
类别也可以创建非公开方法(在 ObjC 中,只要声明不可见)。不同之处在于,在扩展中声明的方法必须在类的主要 @implementation 块中定义,并且扩展还可以(从几个编译器修订版前开始)声明 ivars。 - jscs
@roronoa 怎么在其他类实现中访问接口类方法?我试着在另一个视图类中声明该接口类名称,但这个类名没有出现... - SnakingPrabhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接