2009-06-03 106 views
0

假設我有一個FooController的子類UIViewController,它顯示Foo s的列表。處理我的foo屬性生命週期的最佳做法是什麼?UIViewController子類初始化

我是否將@property定義爲讀取/寫入?這不是真的 - 一旦設置好了,改變它就可能導致狀態不一致。我是否創建@propertyreadonly並編寫一個新的指定初始化程序initWithFoo:(Foo *) aFoo,該程序調用initWithNibName:bundle:?現在,我必須在每次控制器從堆棧彈出時創建一個新實例,並用新的foo推送。

後者似乎喜歡採取的方法,但我從來沒有見過任何人這樣做。那麼標準做法是什麼?

回答

3

屬性通常是要走的路。他們給你KVC/KVO的力量

你應該將該類設置爲Foo屬性(KVO)的觀察者。然後每當Foo被改變時,你都有機會處理它。無需擔心不一致。

 [self addObserver:self forKeyPath:@"foo" options:0 context:@"fooChanged"]; 

然後觀察其變化:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 

    if([keyPath isEqualToString:@"foo"]){ 

     //do your thing 


    } 
} 

現在,如果foo是初始化設置或一段時間後,就可以對付它沒關係。您不希望通過強制任何對象按預定順序與您一起工作,從而破壞代碼。這是非常不靈活,通常是不好的做法。通過這種方式,您可以優雅地處理這些更改。

0

Objective-C是動態語言。所以封裝時不要太嚴格。無論如何,這個ivar可以被KVC認爲。 因此@property(readwrite)是好的。