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

Controlling access to instance variables in Objective-C

从我见过的所有代码来看,几乎总是使用这样的东西来定义 属性 范围:

Class 分机

/*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 中用得不多?

您可以在三个地方声明一个全局变量。 如果你在 .h 中声明它是 public:

@property (nonatomic, strong) NSString *publicString; 

相反,如果您在 .m 中声明相同的内容是私有的,则不需要第二种方式。

很少使用实例变量的访问修饰符,因为它们公开的有关您的 object 结构的信息比您希望让其他人看到的更多。 public 变量的公开绑定到所有未来的实现上,以具有相同的变量。 属性,另一方面,隐藏变量,让您稍后改变主意,计算结果而不是存储它。

属性 访问在 Objective-C 中得到了高度优化,因此实际上没有 run-time 暴露 属性 而不是变量。由于您可以通过切换到 属性 免费获得灵活性,因此很少使用 @public 公开变量。

I was interested why class extension, (like from example above) is used more often than @private modifier

因为 class 扩展允许您将私有属性放在 .m 文件中,而不是 .h header 文件中。 Headers 从其他 .m 文件中包含会创建 compile-time 依赖关系,通过将实现细节放入 class 扩展中可以轻松避免这种情况。