2013-09-24 89 views
2

我看到这个thread,但在编程指南中指出,您可以忽略@synthesise关键字的属性,但在iOS7中并不完全清楚。readonly public,readwrite私有财产

我想有一个@propertyreadonly外部,但readwrite内部。我可以只使用这样的@property关键字吗?

编辑:什么会被认为是更正确的,或至少更多地道的提供的答案。在类扩展中使用单独的readwrite属性还是直接在实现中访问伊娃?

编辑:显示我正在使用类扩展,如答案中所建议。

//.h 
@interface CACustomerAuthenticator : NSObject 
@property (nonatomic, copy, readonly) NSString *username; 
@end 

//.m 
@interface CACustomerAuthenticator() 
@property (nonatomic, copy, readwrite) NSString *username; 
@end 

回答

3

readonly就够了。

使用

@synthesize username = _someVar; 

你被允许在username访问_someVar写。如果没有synthesize,那么

@synthesize username = _username; 

是自动生成的。

+0

你是说我在我的类扩展中不需要任何东西,只有界面中的只读属性? – retrodev

+0

然后,我需要直接在我的实现中访问_username,而不是通过访问者? – retrodev

+0

是的,但您必须通过ivar _username – pNre

7

如果你想这样做,你重新声明属性的类扩展名。

例如,如果你有一个类称为MyClass的:

MyClass.h

@property (nonatomic, copy, readonly) NSString *username; 

MyClass.m

// Create a class extension before the @implementation section 
@interface MyClass() 
@property (nonatomic, copy, readwrite) NSString *username; 
@end 

现在公共接口有属性作为只读,并且私有接口将其作为readwrite。并且您不需要@synthesize属性,默认情况下支持iVar的版本为_username

+0

这是比上面更好的答案,因为除非你以某种方式将它们重新声明为__weak,否则你不能访问块中的_ivars而不创建self/retain循环 – xaphod