UIViewController子类初始化
问题描述:
假设我有一个FooController
的子类UIViewController
,它显示Foo
s的列表。处理我的foo
属性生命周期的最佳做法是什么?UIViewController子类初始化
我是否将@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是动态语言。所以封装时不要太严格。无论如何,这个ivar可以被KVC认为。 因此@property(readwrite)是好的。