2011-04-26 96 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