iPhone Dev Objective-C - 对象被保留,我不知道在哪里

Posted

技术标签:

【中文标题】iPhone Dev Objective-C - 对象被保留,我不知道在哪里【英文标题】:iPhone Dev Objective-C - Object is being retained and I don't know where 【发布时间】:2011-07-06 15:53:07 【问题描述】:

我正在创建一个 iPad 游戏,它有一个 viewController 从一个 nib 文件加载到它的视图中。该视图中有一堆按钮,我通过界面生成器将它们链接到 UIButton * 变量(因此每个按钮都链接到不同的变量)。我在其中一个按钮上加载了 nib 后立即检查了保留计数(使用我的第一个按钮变量 b1),它给我的值为 2。谁能解释为什么它是 2?在笔尖加载后立即保留它的两件事是什么?

现在我更加困惑了,因为在我的 dealloc 函数中,我分别释放了每个按钮变量,然后检查了其中一个的保留计数,结果仍然是 2!它至少应该下降到 1,不是吗?我应该在我的 dealloc 函数中多次释放它吗?如果有,有多少?

谢谢

【问题讨论】:

您是否将它们链接到保留的属性? 尝试使用仪器进行分析。内存泄漏检查器应该会告诉你它被保留在哪里。 @shawnwall 我没有将它们链接到保留的属性。我认为这没有什么区别,因为我从未明确设置按钮变量(因此不需要设置器)@Maz 谢谢我会尝试的 【参考方案1】:

不要看保留计数。

说真的。

除你之外的东西保留你的东西。那些数字会因为一些看起来毫无意义的原因在你身下移动,然后你会回到这里并发布令人困惑的问题。

只需确保您的保留和释放平衡。这是你唯一的工作。

【讨论】:

ios 设备上更重要的是,由于内存有限,所有内存都得到了有效利用。如果出现故障,最终用户不在乎是你还是苹果失败了,他们只会怪你。 好的,谢谢。一个后续问题:如果我从未明确设置或获取 IBOulets,是否将它们设置为属性? (如在 IBOutlet 按钮变量中我连接到 nib 文件中的按钮)?我是否应该在最后释放所有这些按钮变量,即使我从未明确保留它们(它们是通过界面构建​​器设置的)? @Tim - 当您的视图加载时,它们将被保留(假设您在属性声明中使用了“保留”设置器语义)。所以你需要释放它们。 @Dan Ray - 我实际上并没有创建按钮 IBOutlets 属性,我只是在我的标题中将它们声明为变量。这是否意味着我不必担心释放它们? (我也从未明确设置过它们中的任何一个)。 @Tim - 不,这意味着您没有保留它们,这很危险。绝对想让它们成为属性,使用 'retain' setter 语义,并在-dealloc 中明确释放它们。【参考方案2】:

如果您的 IBOutlet 属性被保留,那么当按钮被添加到超级视图时,您将保留 1 个和另一个...

正如 Dan Ray 所说,您不必真正担心 retainCount...

【讨论】:

以上是关于iPhone Dev Objective-C - 对象被保留,我不知道在哪里的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Objective-C 判断 iPhone 是不是连接到 wifi 网络?

在 UITextField 键盘中启用“返回按钮”(objective-c/iphone)

在 Objective-C (iPhone) 中卸载视图

在 Objective-C (iphone) 中,如何管理“@protocol”引用的内存?

使用 Objective-C 在 iPhone 上禁用 WIFI

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库 [关闭]