UIViewController子类初始化

问题描述:

假设我有一个FooController的子类UIViewController,它显示Foo s的列表。处理我的foo属性生命周期的最佳做法是什么?UIViewController子类初始化

我是否将@property定义为读取/写入?这不是真的 - 一旦设置好了,改变它就可能导致状态不一致。我是否创建@propertyreadonly并编写一个新的指定初始化程序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)是好的。