之前在看代码的时候一直不明白在.m文件中为什么有@interface,为什么要在.m文件中写@property,而不是写在.h文件中,今天重新读《Objective -C基础教程》,才发现这种写法是类扩展(class extention)。是一种特殊的类别,我们知道类别是不可以增加新的实例变量的,然而类扩展可以。
- 类扩展不需要名字。
- 可以添加新的实例变量。
- 可以将只读权限修改成可读写的权限。
- 创建的数量不限。
例如:
</pre><pre name="code" class="cpp">@interfece Things:NSObject
@property (assign) NSInteger things1;
@property (readonly,assign) NSInteger things2;
-(void) resetAllValues;
@end
这个类包含了两个属性和一个方法。在.m文件中
@interface Things()
{
NSInteger things4;
}
@property (readwrite,assign) NSInteger things2;
@property (assign) NSInteger things3;
@end
这看起来像是在定义一个类,只不过没有继承父类。我们所做的是获取Things类,并通过添加私有属性和方法来扩展它,这就是它被成为类扩展的原因。仔细看things2属性,我们在.h文件中定义过了,在.m文件中我们修改了它的读写权限。将它标记为readwrite。这样编译器就会自动生成setter方法了。不过它是只能在这个类中访问的私有方法,在公共接口中则只有getter方法。我们还添加了私有属性,things3,它只可以在这个类的内部使用,此外还添加了一个名为thing4的实例变量,它同样是私有的。
那么我们为什么要做这些事情,面向对象编程的一个特征就是信息的隐藏,你只会把用户需要看到的信息展示出来,而内部细节不需要。