gpt4 book ai didi

ios - 为什么 myInstance = nil 而不是 self.myInstance = nil?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:52:16 25 4
gpt4 key购买 nike

我为什么要使用(在我的 dealloc 方法中)?

  1. [myInstance release] 而不是 [self.myInstance release]
  2. myInstance = nil 而不是 self.myInstance = nil

尽管我们使用 self.myInstance = [[[AClass alloc] init] autorelease] 而不是 myInstance = [[[AClass alloc] init] autorelease]?

这些做法来 self 在网络上看到的众多示例。

最佳答案

1) [myInstance release] instead of [self.myInstance release]

更喜欢前者。

self.myInstance 的返回值由子类重写方法 myInstance 时的实现定义。您对 dealloc 期间构造对象的接口(interface)行为不感兴趣(因为子类可能会覆盖并返回除您的 ivar 之外的其他内容)。

你对 dealloc 感兴趣的是在你的对象被销毁之前释放你拥有的引用。如果子类重写了 myInstance,那么它可以:

a) 返回一个已经发布的ivar(在子类中声明)

b) 覆盖的实现可能会返回一个新创建的自动释放对象

a 或 b 都可能导致过度释放和崩溃(假设其他一切都正确保留/释放)。这也说明了为什么你应该在释放后将 nil 分配给 ivar。

这也是如何触发对象复活的经典例子。当您调用的 getter/setter 的实现在它已经被释放后重新创建其状态时,就会发生对象复活。最不令人反感的副作用会导致无害的泄漏。

2) myInstance = nil instead of self.myInstance = nil

同样,更喜欢前者。

正式的回应看起来很像对 #1 的回应——基本原理、副作用和危险也适用于此。

处理这个问题最安全的方法是直接访问 ivar:

[myInstance release], myInstance = nil;

因为可能存在难以重现的非常严重的副作用(崩溃、泄漏、复活)。

这些危险很容易避免,您的代码也更容易维护。另一方面,如果人们在使用您的程序时遇到副作用,他们可能会尽可能避免(重新)使用它。

祝你好运

关于ios - 为什么 myInstance = nil 而不是 self.myInstance = nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4895189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com