公共iVar;其他课程只读

时间:2012-02-24 05:09:39

标签: objective-c

通过其拥有的类使iVar可写的最佳方法是什么,但是其他类只能读取它?

有不止一种方法吗?

我能想到的唯一方法是为iVar设置一个@property (readonly),但不要在拥有类中使用点符号(我猜测它不能用于readonly),并且在拥有class只是直接引用它,没有点表示法,然后在其他类中,用点表示法引用它。

但我很好奇是否有其他方法。

2 个答案:

答案 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