【问题标题】:UIViewController subclass initializationUIViewController 子类初始化
【发布时间】:2009-06-03 20:40:00
【问题描述】:
假设我有一个UIViewController 的FooController 子类,它显示Foos 的列表。处理 foo 属性生命周期的最佳做法是什么?
我是否将@property 定义为读/写?它不是真的——一旦它被设置,改变它可能会导致不一致的状态。我是否将@property 创建为readonly 并编写一个新的指定初始化程序initWithFoo:(Foo *) aFoo 来调用initWithNibName:bundle:?现在,每次控制器从堆栈中弹出时,我都必须创建一个新实例,并使用新的foo 推送。
在我看来,后者喜欢采取的方法,但我从未见过有人这样做。那么标准做法是什么?
【问题讨论】:
标签:
iphone
objective-c
cocoa-touch
【解决方案1】:
属性通常是要走的路。它们为您提供 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 还是稍后设置,都可以处理它。您不希望通过强制任何对象以预定顺序与您的类一起工作来破坏您的代码。这是非常不灵活的做法,通常是不好的做法。这样你就可以优雅地处理这些变化了。
【解决方案2】:
Objective-C 是动态语言。所以在封装上不要那么严格。这个 ivar 无论如何都可以通过 KVC 来实现。
所以 @property (readwrite) 没问题。