Objective C iPhone 何时将对象引用设置为 nil

2024-06-25

我使用 Objective C 和 Cocoa 框架进行开发已经有一段时间了。然而,我仍然不太清楚,我什么时候应该将对象引用设置为 nil。我知道建议在释放具有委托的对象之前执行此操作,并且您还应该在保留子视图的 viewDidUnload 方法中执行此操作。但究竟什么时候应该这样做以及为什么?它到底完成了什么?先感谢您。

-Oscar


假设你有一个指针myView在你的类的接口中定义:

@interface MyClass {
   UIView *myView;
}

@end

然后在您的代码中,在某个时刻,您可以释放该变量:

[myView release];

当你这样做之后,myView,指针不会指向 nil,而是指向可能不再存在的对象的内存地址(因为您刚刚释放了它)。因此,如果您在此之后碰巧做了某件事,例如:

[myView addSubview:otherView];

你会得到一个错误。

另一方面,如果您这样做:

[myView release];
myView = nil;
...
[myView addSubview:otherView];

打电话给addSubview不会产生任何负面影响,因为发送给 nil 的消息将被忽略.

作为推论,您可能会看到使用的建议retain属性,例如:

@property(retain) UIView *myView;

然后在代码中,只需执行以下操作:

self.myView = nil;

通过这样做,合成的访问器将释放旧对象并在一行代码中将引用设置为 nil。如果您想确保所有属性都被释放并设置为零,这可能会很有用。

你永远不能忘记的一件事是,内存管理是通过retain release调用,而不是通过赋值 nil 的方式。如果你有一个保留计数为 1 的对象,并将 nil 分配给它的唯一变量,你将泄漏内存:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,10,10)];
view = nil;
// You just leaked a UIView instance!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective C iPhone 何时将对象引用设置为 nil 的相关文章

随机推荐

  • 如何将 Excel Interop 与 ClosedXml 混合使用:样式

    我试图在 Excel VSTO 加载项中实现以下目标 从 Excel 文件的原始版本复制 应用单元格格式 原因 在处理 Excel 文件时 我们偶尔需要更改文件的样式 颜色 以便能够仅处理某些单元格 文件处理后 我们需要恢复原始的单元格格式
  • Android 复杂形状按钮

    你好安卓开发者 我的 UI 设计师想要一个复杂形状的按钮 但我不知道该怎么做 请帮助我 这就是她想要的设计image http img823 imageshack us img823 984 q43b png 有很多方法可以做到这一点 最简
  • 如何从hibernate会话获取jdbc连接? [复制]

    这个问题在这里已经有答案了 我想从hibernate会话获取jdbc连接 hibernate会话中有方法 即 session connection 但它已被弃用 我知道这仍然有效 但我不想使用已弃用的方法 因为我确信他们必须为此提供一些替代
  • 接口协方差问题

    以下代码示例 interface I
  • 设置删除标记时的缩放级别

    使用 javascript 谷歌地图 api 我目前已将其设置为删除制造商 当我添加像这样的位置时 我将其设置为 function addLocation map location var point new GLatLng locatio
  • 使用 PDO 扩展的execute(array())插入语句不起作用

    stmt conn gt prepare INSERT INTO user VALUES username md5 password 1 email 0 0 cover dateofbirthYear dateofbirthMonth da
  • 指向 lambda 的函数指针目标的生命周期是多少?

    抱歉 这是一个冗长的问题 但让我来分解一下 C 标准是否保证 void Ptr void return Ptr 仍将是定义的行为吗 我知道 对于闭包 它将被定义 因为该闭包对象是按值移动 复制的 但是 虽然我知道 常规 函数具有无限 无生命
  • 跨多个模块的 Python 日志记录

    我正在尝试将日志记录 到控制台而不是文件 添加到我已经工作了一段时间的代码中 阅读了一些内容后 我有一个我认为应该可行的模式 但我不太确定我哪里出错了 我有以下三个文件 显然是简化的 控制器 py import my module impo
  • 哪些工具向 Bugzilla 或 Mylyn 提供燃尽图? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我和我的团队需要使用 Mylyn 开发一个项目 该项目的错误已在 Bugzilla 中归档 您是否知道有
  • 有关 items_for_sale 随着时间的推移更新的数据库/架构设计问题

    我知道我的问题的明显答案是 这取决于 解决这个问题后 我希望你们中的一个 或多个 能够帮助我找到解决这个问题的常见方法 我正在设计一个待售小部件数据库 随着时间的推移 每件商品的价格将不可避免地发生变化 我的问题是我们是否应该跟踪这些变化
  • React - 防止标签切换时焦点脱离模式

    我自己构建了一个反应模式 当我在模式打开时按 Tab 键时 焦点仍然转到背景页面 如何将焦点限制在模态框内的组件内 下面的逻辑应该是什么 onKeyPress e if e keyCode 9 e preventDefault logic
  • AttributeError:使用 Flask 无模式登录时,模块“flask_login.login_manager”没有属性“user_loader”

    我有以下代码 我尝试使用 Flask 进行身份验证 from flask import Flask from flask login import LoginManager login manager from auth auth impo
  • Three.js:相机绕球体飞行?

    在 Three js 使用 JavaScript WebGL 中 如何创建一个以固定高度 固定前进速度和相对于球体的固定方向围绕球体飞行的相机 用户只能向左转向和正确的 想象一架飞机在一根看不见的绳子上飞向地球的中心 在地面附近飞行并且总是
  • UCanAccess:向现有表添加列

    我有一个正在运行的 Java 项目 它使用 Access accdb 数据库来存储数据 我正在对我的程序进行更新 以便为用户提供更多功能 为此 我需要向填充数据的现有表添加一列 当我研究时 我发现 UCanAccess 不支持 ALTER
  • ColdFusion 11 中的自动类型转换

    我正在将应用程序从 ColdFusion 9 迁移到 ColdFusion 11 在现有代码中 有一个变量分配给false
  • 如何为 WPF 工具包图表提供样式

    我在 WPF 应用程序中使用 WPF Toolkit Chart 和 PieChart 我想将饼图图片中的默认白色背景更改为透明 如何提供风格来实现这一目标 WPF 旨在允许您通过 XAML 设置控件样式 不是代码 还可以通过样式使饼图中的
  • 基准测试socket.io

    我想对我的 socket io 服务器进行基准测试 我想测试服务器可以处理多少并行连接和消息 但是当我用大约 200 个 websocket 启动基准测试几分钟后 我的 socket io 服务器崩溃了 我尝试使用node js的集群模块将
  • python os.path.exists() 对于存在的 nfs 挂载目录文件失败

    我基本上有一个用于网站的网络服务器和另一个仅存储文件的网络服务器 文件服务器通过安装其目录之一连接到主服务器 该网站运行 Django 所以我主要处理 python 不管怎样 我似乎遇到了一些问题 文件被报告为不存在 即使它们实际上存在 基
  • 如何在 Braintree Paypal 结帐中添加税费和运费

    我正在使用 Braintree Paypal Checkout 它对我来说工作正常 但我无法添加税费和运费 我试图获取一些信息 但这对我来说也不起作用 这是我当前的 Braintree 代码查看 var form document quer
  • Objective C iPhone 何时将对象引用设置为 nil

    我使用 Objective C 和 Cocoa 框架进行开发已经有一段时间了 然而 我仍然不太清楚 我什么时候应该将对象引用设置为 nil 我知道建议在释放具有委托的对象之前执行此操作 并且您还应该在保留子视图的 viewDidUnload