控制对Objective-C中实例变量的访问

时间:2015-02-12 15:07:57

标签: objective-c class properties scope ivar

从我见过的所有代码中,对于属性范围定义几乎总是使用类似的东西:

课程扩展

/*We declare the class extension*/
@interface  MyClass () 

@property (nonatomic, retain) Type *aPrivateProperty; 
- (void)aPrivateMethod;

@end

/*
We can use the main implementation block to implement our properties
and methods declared in the class extension.
*/
@implementation MyClass

/*Therefore we can use synthesize ;-)*/
@synthesize aPrivateProperty;

- (void)aPrivateMethod {        
    //Some code there
}

@end

但这是(从我所见过的)很少使用:

@interface MyClass : NSObject {
    iVar *aProtectedIVar;
    @public
    iVar *aPublicIVar;
    iVar *aSecondPublicIVar;
    @protected
    iVar *aSecondProtectedIVar;
    @private
    iVar *aPrivateIVAr;
}

@end

为什么像@private,@ protected和@public这样的修饰符在Objective-C中没有被如此多地使用?

2 个答案:

答案 0 :(得分:1)

很少使用实例变量的访问修饰符,因为它们会显示有关对象结构的更多信息,而不是允许其他人查看。公共变量的暴露对所有未来的实现具有约束力以具有相同的变量。另一方面,属性隐藏变量,让您稍后改变主意,并计算结果而不是存储它。

在Objective-C中对属性访问进行了高度优化,因此暴露属性而不是变量几乎没有运行时命中。由于您通过切换到属性可以获得免费的灵活性,因此很少使用@public公开变量。

  

我很感兴趣为什么类扩展(比如上面的例子)比@private修饰符更频繁地使用

因为类扩展允许您使用.m文件而不是.h头文件放置私有属性。其他.m文件中包含的标头创建了编译时依赖项,通过将实现细节放入类扩展中可以轻松避免这种情况。

答案 1 :(得分:0)

您可以在三个位置声明一个全局变量。 如果你在.h中声明这是公开的:

@property (nonatomic, strong) NSString *publicString; 

相反,如果你在.m中声明相同,则不需要第二种方式。