iphone - Object c property dealloc,哪个是正确的?

标签 iphone objective-c ios ipad properties

<分区>

Possible Duplicate:
Dealloc method in iOS and setting objects to nil

关于object c中的property dealloc,我见过各种形式。以下哪项是最好的/正确的

//Kind1:
- (void)dealloc
{
    [_property release];
    [super dealloc];
}

//Kind2:
- (void)dealloc
{
    self.property = nil;
    [super dealloc];
}

//Kind3:
- (void)dealloc
{
    [_property release]; _property = nil;
    [super dealloc];
}

最佳答案

您的第二个选择是不可取的。属性 setter 可能有副作用,并且通常不会在考虑到对象可能已经被拆掉一半的情况下实现。一般来说,除了 [super dealloc] 之外,您应该避免从 dealloc 调用任何方法调用 self(或 super)。您还应该避免对其他对象进行非平凡的调用(即除了释放之外的任何调用),因为您可能有循环引用,这可能会导致返回对您的半释放对象的引用。

第一个选项就足够了。请注意,如果您使用 ARC,它是多余的。使用 ARC 总是最好的选择,因为它不仅更安全而且更快。

第三种选择是有争议的。有些人争辩说它使您的程序对错误更具弹性(因为 dealloc 之后的引用可能会在零实例变量处结束,而不是通过它弹跳并出现段错误,或者更糟)。他们还争辩说,它确保如果您确实运行一个尝试使用该值的方法,它可能会优雅地失败(同样,而不是取消引用此时的悬垂指针)。但是,如果您赞同我关于避免这种情况的第一点,那么它就变得有些没有实际意义了。我的经验是,依赖这种行为是一个坏主意 - 即使它是一个干净的设计,也很容易忘记它并最终在一段时间后以破坏它的方式更改代码。

那些不喜欢第三种选择的人也认为它隐藏了错误。有些甚至不使用 nil 而是明显地覆盖一个明显的虚假值(例如 0x0badf00d),以使其更清楚是否以及何时取消引用悬空指针。

关于iphone - Object c property dealloc,哪个是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13898857/

上一篇:objective-c - iOS UITableView numberOfRowsInSection 错误访问

下一篇:ios - 核心数据实体中的托管对象导致 "is not key value coding-compliant for key"错误

相关文章:

ios - SwiftUI - 为什么当我在 macOS 上更改选项卡时 TabView 及其内容有时不刷新?

ios - ios 一根手指捏合手势

ios - iOS屏幕捕获模糊

iphone - NSMutableDictionary 不会添加到 NSMutableArray 中

ios - 邮件和消息未从警报 View 中消失

ios - Receiver () 没有标识符为 'secondViewControllerSegue` 的 segue

ios - 向上或向下滚动 UITableview 时更改值

objective-c - 如何使用 AFNetworking 设置超时

ios - 呈现 UIImagePickerController 会导致 iOS 7 崩溃

ios - 手机响时,iOS运行应用程序