假设我有一个FooController
UIViewController
子类,它显示Foo
的列表。处理foo
属性生命周期的最佳做法是什么?
我是否将@property
定义为读/写?事实并非如此 - 一旦设定,改变它可能会导致状态不一致。我是否将@property
创建为readonly
并编写了一个新的指定初始值设定项initWithFoo:(Foo *) aFoo
来调用initWithNibName:bundle:
?现在,每次从堆栈弹出控制器时,我都必须创建一个新实例,然后使用新的foo
推送。
后者在我看来就像采取的方法,但我从来没有见过有人这样做。那么什么是标准做法?
答案 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)没问题。