2012-02-24 130 views
1

使其拥有的类可由其写入但由其他类只读的iVar的最佳方式是什么?公共iVar;从其他类读取

有多种方法吗?

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

但我很好奇,如果有其他方法。

回答

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,所以上述内容不是防弹的 - 有方法调用属性设置器 - 但编译器会标记从类外部指定属性的错误。]

后评论:

[注2:一个匿名类/扩展是非常相似的命名类别。前者必须执行的主要实现,后者可以实现在@implementation classname (categoryname)或主要实现。此外,只有主接口,类扩展/匿名类接口和主实现可以声明实例变量;指定类别的接口和实现可能不会。属性可以在匿名类和命名类中声明,但是它们只能在主实现中合成,而不能在命名类实现中合成。这个注释在发布时是正确的,其中一些功能已经随着Objective-C/Xcode的发展而发生了变化。]

+0

谢谢;两个后续问题:如果你命名类别 - 我经常看到人们将私有声明放在私人声明中,那么另一个类访问财产的二传手是什么方法,即使公有财产是读写? – johnbakers 2012-02-24 05:36:47

+0

我已经对他原来的帖子进行了一些修改,希望他会批准它们,但是它的信息不正确。这是一个类扩展而不是一个类,2个非常不同的东西。 – 2012-02-24 05:42:40

+0

谢谢,我学到了一些新东西! – 2012-02-24 06:05:59

0

使用私有说明符作为ivars和类扩展来定义访问者 - 这种方式ivar是私有的班上。

// FooClass.h @interface FooClass:NSObject {} {private void bo bo;

} @end

// FooClass。米

@interface FooClass(){

}

@属性(非原子,分配)INT嘘声;

@end

@implementation FooClass

@synthesize嘘声; // ...

@end