![](/img/trans.png)
[英]Which initialization method gets called in an UIViewController subclass, when it is initialized by a nib?
[英]UIViewController subclass initialization
說我有一個UIViewController
的FooController
子類,它顯示Foo
的列表。 處理foo
屬性的生命周期的最佳實踐是什么?
我是否將@property
定義為可讀寫? 這不是真的-一旦設置,更改它可能會導致狀態不一致。 我是否將@property
創建為readonly
並編寫一個新的指定初始化程序initWithFoo:(Foo *) aFoo
來調用initWithNibName:bundle:
? 現在,每次控制器從堆棧彈出並使用新的foo
推入時,我都必須創建一個新實例。
在我看來,后者似乎很喜歡這種方法,但是我從未見過有人這樣做。 那么標准做法是什么?
屬性通常是要走的路。 他們給您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還是以后都沒關系,您可以對其進行處理。 您不希望通過強制任何對象以預定順序與您的班級一起工作來破壞代碼。 這是非常不靈活的做法,通常是不好的做法。 這樣,您就可以優雅地應對這些更改。
Objective-C是動態語言。 因此,封裝不要太嚴格。 無論如何,可以通過KVC達到這個ivar。 因此, @ property(讀寫)可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.