从我见过的所有代码中,对于属性范围定义几乎总是使用类似的东西:
课程扩展
/*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中没有被如此多地使用?
答案 0 :(得分:1)
很少使用实例变量的访问修饰符,因为它们会显示有关对象结构的更多信息,而不是允许其他人查看。公共变量的暴露对所有未来的实现具有约束力以具有相同的变量。另一方面,属性隐藏变量,让您稍后改变主意,并计算结果而不是存储它。
在Objective-C中对属性访问进行了高度优化,因此暴露属性而不是变量几乎没有运行时命中。由于您通过切换到属性可以获得免费的灵活性,因此很少使用@public
公开变量。
我很感兴趣为什么类扩展(比如上面的例子)比
@private
修饰符更频繁地使用
因为类扩展允许您使用.m文件而不是.h头文件放置私有属性。其他.m文件中包含的标头创建了编译时依赖项,通过将实现细节放入类扩展中可以轻松避免这种情况。
答案 1 :(得分:0)
您可以在三个位置声明一个全局变量。 如果你在.h中声明这是公开的:
@property (nonatomic, strong) NSString *publicString;
相反,如果你在.m中声明相同,则不需要第二种方式。