Private properties 私有属性

我们之前提过,在 Objective-C 里,其实没有真正的私有方法的,哪怕你没有在你的头文件里声明,依然可以用 performSelector 方法来访问。而属性,其实就是方法合成的实例变量,这也就是说,在 Objective-C 里也没有真正私有的属性。不过退一步讲,你也可以把它在头文件里的借口删掉,至少保证它不会暴露在外部。

我们创建伪私有属性要比伪私有方法麻烦一些,因为我们还要去声明这个属性,这里用到的方法我们管它叫做类扩展(class extension)。这个方法可以让我们给 Person 类第二个接口,第一个接口是我们的 Person.h 文件,里面声明了 printGreeting 方法,现在我们可以把他的第二个接口写在 Person.m 文件里,然后在里面创建 name 属性。

我们的 Person.h 文件现在可以这样写:

@interface Person : NSObject
- (void)printGreeting;
@end

看起来很空哈,而且并没有提到 name 属性。实际上,对于一个已经存在的类来说,把属性移动到这个类扩展里更有效率。

我们来看新的 Person.m 文件要怎么写:

@interface Person ()
@property NSString *name;
@end
@implementation Person
- (void)printGreeting {
    NSLog(@"Hello, %@!", self.name);
} @end

注意,我们在 main.m 文件里面只引入 Person.h 文件,所以说,现在为止 main() 函数里面,还没有调用 Person 类里面的 name 属性。

注意呀,第二个 @interface 跟第一个不一样的,他并不是一个新的类,而是原有类的类扩展,Person 是原有类的名称,后面跟一对空的圆括号。

尽管这一点以后可能会变,现在你还是要记住:你能只能写你定义的类的类扩展,换句话说,你是不能写系统类的扩展,比如 UIKit,你是写不了它的扩展的。

results matching ""

    No results matching ""