为什么在.m文件里有另一个@interface?

有时我会看到另外一个接口声明:

@interface MyCode () @end 

这不是在.h文件中重复的吗?

这是Xcode提供的一个类别,用于声明只能在此实现文件中使用的私有属性和方法。

你不会总是希望将你的类的所有方法公开给外部世界,相反,你会在这个私有类别中声明它们(我总是在这些私有方法前加上一个下划线( _ )来使它显而易见,一个私有方法,但是完全是可选的)。

作为一个例子,这里是我不想暴露的一种私有的初始化方法:

 @interface MyClass () - (BOOL)_init; @end @implementation MyClass - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self != nil) { if (![self _init]) self = nil; } return self; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:code]; if (self != nil) { if (![self _init]) self = nil; } return self; } - (BOOL)_init { self.something = whatnot; self.thingA = self.thingB; return YES; } 

当你想要声明私有的ivars / properties / methods的时候使用它。

在.h文件中有公共的方法和属性,在.m文件中有私有的。

其概念是,如果将.h限制在您的类的公共接口,然后将私有实现详细信息放在此类扩展中,则可以使项目更清晰。 在Objective-C指南编程中查看私有类扩展的讨论。

这个@Interface允许你声明私有的ivars,属性和方法。 所以你在这里声明的任何东西都不能从这个课堂以外的地方访问。 一般来说,除非类的一个实例需要访问它们,否则默认情况下你想声明所有的ivars,属性和方法都是私有的(在这个@interface()中)。

希望这可以帮助

这是一个类扩展。 阅读更多

通常用于声明私有的ivars / properties / methods。