2012-04-13 47 views
2

确定基本上,我在iPhone应用程序中有一个类,我希望它只读一些propertys。这意味着拥有的类可以读取和写入属性,但其他对象只能读取它。当我声明属性时,我尝试“只读”选项,但是我的班级甚至无法写入它。那有什么用处?在iOS中创建iPhone属性只读objective-c

回答

3

如果不是太不方便,只需在你的类中使用ivar或“backing”变量来修改该值。就像这样:

在您的.h文件中:

@interface ClassName 

@property (readonly,nonatomic) NSInteger readOnlyValue; 

@end 

在您.m文件:

@implementation ClassName 

@synthesize readOnlyValue = _readOnlyValue; 



_readOnlyValue = 42; 

@end 
+0

我会试试看。谢谢。 – 2012-04-13 21:41:23

+0

这是简化的,因为你使用原始类型。如果readOnlyValue将是一个Object,例如UILabel,那么保留版本呢? – AlexWien 2012-12-01 16:03:33

0

你可以在.m类中实现你自己的setter或者synteshize为: foo = _foo;所以你可以在内部调用_foo(私有变量)

0

在进一步思考,实现这一目标的最简单的方法是添加一个正常的财产一个类扩展,然后在头中声明一个getter。例如。

接口:

@interface MyClass: NSObject 

- (NSString *)someString; 

@end 

实现:

@interface MyClass() 
@property (nonatomic, retain) NSString *someString; 
@end 

@implementation MyClass 

@synthesize someString; 

@end 

您可以获取和设置,使用点符号或其他方式,并直接在类内访问someString实例变量,和每个看过界面的人都可以使用点符号或其他方式获得。

2

虽然你可以像其他答案中描述的那样去直接访问iVar,但更好的解决方案通常是使用类扩展。它们的设计正好是为了解决这个问题,通过使用它们,您可以稍后重构代码,以便将@propertyreadwrite定义暴露给应用中的其他类,而不会将其暴露给所有类。

前段时间我写了一个detailed explanation

6

我们假设您想在的类中创建一个名为foo的属性int

执行此操作界面中的任何文件(.h):

@property(readonly) int foo; 

然后在你的实现(.M)文件,建立一个类扩展,你可以重新定义你的财产。

@interface YourClass() 

@property(readwrite) int foo; 

@end 

这将导致财产被readonly公开,但私下里readwrite

然后,当然,你在下面的实现中合成foo

@synthesize foo;