当前位置:  开发笔记 > 前端 > 正文

为什么我不应该在init/dealloc中使用Objective C 2.0访问器?

如何解决《为什么我不应该在init/dealloc中使用ObjectiveC2.0访问器?》经验,为你挑选了3个好方法。

在@ mmalc的 响应于这个问题,他指出:"一般来说,你应该使用访问中的dealloc方法(或init)." 为什么mmalc这样说?

我能想到的唯一真正原因是性能和避免@dynamic制定者的未知副作用.

讨论?



1> Andrew Grant..:

它基本上是一个最小化错误可能性的指南.

在这种情况下,存在(可能性)您的setter/getter可能无意中对对象的状态做出直接或间接的假设.当对象处于设置或销毁之中时,这些假设可能是一个问题.

例如,在下面的代码中,观察者不知道'Example'正在被销毁,并且可以假设已经被释放的其他属性是有效的.

(你可以争辩说,你的对象应该在撕下自己之前删除所有观察者,这是一种很好的做法,另一个指导可以防止意外问题).

@implementation Example

-(void) setFoo:(Foo*)foo
{
   _foo = foo;
  [_observer onPropertyChange:self object:foo];
}

-(void) dealloc
{
   ...
   self.foo = nil;
}

@end


请参阅http://lists.apple.com/archives/cocoa-dev/2008/Jul/msg00808.html或http://lists.apple.com/archives/Cocoa-dev/2004/Jan/msg01684.html或http ://developer.apple.com/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html#/
我看到你在说什么,但我并不是真的在买它.唯一真正的副作用是当对象处于dealloc中时KVO被触发.这真的很糟糕吗?我已经做了一段时间(在objc2之前使用[self setFoo:NULL]样式)并且还没有看到一个问题.
我喜欢一些可以说明问题的示例代码 - 如果有的话.有人为此而努力吗?:-)

2> Louis Gerbar..:

这完全是关于使用惯用的一致代码.如果您对所有代码进行了适当的模式化,那么有一些规则可以保证在init/dealloc中使用访问器是安全的.

最大的问题是(正如mmalc所说)设置属性默认状态的代码不应该通过访问器,因为它会导致各种令人讨厌的问题.问题是init没有理由设置属性的默认状态.出于多种原因,我一直在转向自我初始化的访问器,如下面的简单示例:

- (NSMutableDictionary *) myMutableDict {
    if (!myMutableDict) {
        myMutableDict = [[NSMutableDictionary alloc] init];
    }

    return myMutableDict;
}

这种属性初始化允许人们推迟许多实际上不必要的初始化代码.在上面的例子中,init不负责启动属性状态,并且在init方法中使用访问器是完全安全的(甚至是必要的).

不可否认,这确实对您的代码施加了额外的限制,例如,具有超类中属性的自定义访问器的子类必须调用超类访问器,但这些限制与Cocoa中常见的各种其他限制并不相符.


此外,这样您就无法将"nil"分配给此属性,因为访问者将自动创建数组的新实例.
有趣的一点,但请注意(除非你假设垃圾收集?)你给出的例子留下myMutableDict自动释放...

3> mmalc..:

你是在自问自答:

    性能本身可能是一个非常充分的理由(特别是如果你的访问器是原子的).

    您应该避免访问者可能产生的任何副作用.

如果您的类可能是子类,则后者尤其是一个问题.

但是,目前尚不清楚为什么在Objective-C 2访问器中专门解决这个问题?无论您是自己使用声明属性还是编写访问器,相同的原则都适用.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有