UIViewController子类初始化

时间:2009-06-03 20:40:01

标签: iphone objective-c cocoa-touch

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

我是否将@property定义为读/写?事实并非如此 - 一旦设定,改变它可能会导致状态不一致。我是否将@property创建为readonly并编写了一个新的指定初始值设定项initWithFoo:(Foo *) aFoo来调用initWithNibName:bundle:?现在,每次从堆栈弹出控制器时,我都必须创建一个新实例,然后使用新的foo推送。

后者在我看来就像采取的方法,但我从来没有见过有人这样做。那么什么是标准做法?

2 个答案:

答案 0 :(得分: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是在初始化程序中设置还是稍后,您都可以处理它。您不希望通过强制任何对象按预定顺序与您一起工作来使代码中断。这是非常不灵活的,通常是不好的做法。通过这种方式,您可以优雅地处理这些变化。

答案 1 :(得分:0)

Objective-C是动态语言。因此,封装不要太严格。无论如何,这个ivar可以通过KVC来达成。 所以 @property(readwrite)没问题。

相关问题