通过其拥有的类使iVar可写的最佳方法是什么,但是其他类只能读取它?
有不止一种方法吗?
我能想到的唯一方法是为iVar设置一个@property (readonly)
,但不要在拥有类中使用点符号(我猜测它不能用于readonly),并且在拥有class只是直接引用它,没有点表示法,然后在其他类中,用点表示法引用它。
但我很好奇是否有其他方法。
答案 0 :(得分:4)
您可以为实现创建一个读/写属性。您可以在实现中使用类扩展或匿名类别来执行此操作。更容易证明,例如,在你的.h:
@interface MyClass
@property (readonly) NSInteger age;
...
@end
并在你的.m:
@interface MyClass () // class extension/anonymous category for private methods & properties
// implementation of these go in main @implementation
@property (readwrite) NSInteger age;
...
@end
@implementation MyClass
@synthesize age;
...
@end
现在,您可以将类中的属性读/写,并从外部以只读方式使用。
您对私人方法也这样做。
[注意:这是Objective-C所以上面的内容不是防弹 - 有很多方法可以调用属性setter - 但编译器会标记从类外部分配给属性的错误。 ]
评论后:
[注2:匿名类别/类扩展与命名类别非常相似。前必须在主实现中实现,后者可以在@implementation classname (categoryname)
或主实现中实现。此外,只有主接口,类扩展/匿名类的接口和主实现可以声明实例变量;命名类别的接口和实现可能不会。可以在匿名和命名类别中声明属性,但是它们只能在主实现中合成,而不能在命名类别实现中合成。这个说明在发布时是正确的,其中一些功能随着Objective-C / Xcode的发展而改变。]
答案 1 :(得分:0)
使用ivars的私有说明符和类扩展来定义访问者 - 这就是ivar对类的私有。
// FooClass.h @interface FooClass:NSObject { @private int boo;
} @end
// FooClass.m
@interface FooClass(){
}
@property(nonatomic,assign)int boo;
@end
@implementation FooClass
@synthesize boo; // ....
@end