• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:52:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我为什么要使用(在我的 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 在网络上看到的大量示例。



Best Answer-推荐答案


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

更喜欢前者。

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

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

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

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

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

这也是如何触发对象复活的经典示例。当您调用的 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap