2011-04-26 72 views
2

什么是最好的方式来创建一个只读给公众,并阅读/写入“私人”的财产?我可以创建一个只读方法,并在.m文件中以无名扩展名声明该属性,但最好我想保留点符号。公众阅读,“私人”保留财产

回答

6

在你的公共接口,财产申报只读即

// Foo.h 
@interface Foo 
{ 
@private 
    Baz* bar; 
} 
@property (readonly, retain) Baz* bar; 

@end 

在您的实现可以声明class extension,那么你重新声明属性读/写:

// Foo.m 

@interface Foo() // Note parentheses 

@property (retain) Baz* bar; 

@end 

@implementation Foo 

@synthesize bar; 

@end 

上述手段那么setter和getter都将被创建,但是在包含头文件的文件中,只有getter会被了解。缺点是setter确实存在,所以如果你忽略了编译器警告并在Foo.m之外使用setter,它仍然可以工作。

但是,相比直接声明只读属性并直接访问伊娃而言,您不必手动实现KVO,当然,内存管理自动完成。

+0

我没有意识到你可以像这样宣布两次。优秀! – Morrowless 2011-04-26 10:11:09

+0

@hyn:顺便说一下,点符号与'@ property'无关。如果你有一个方法声明为' - (Baz *)bar;'你可以使用点符号来访问它。 – JeremyP 2011-04-26 10:15:58

+0

也不知道。感谢您的信息:) – Morrowless 2011-04-27 03:56:46

2

通常人们在@synthesize声明中创建一个实例var并将其与readonly属性配对。但是,伊娃不能通过点符号访问。你必须直接通过它的名字来访问它。

+0

我试图通过'self'来访问ivars。因为它让内存管理变得更简单。 – Morrowless 2011-04-27 03:58:48