在 init 和 dealloc 方法中有效使用访问器?

2024-04-06

我现在从多个来源(stackoverflow.com、cocoa-dev、文档、博客等)听说,在 init 和 dealloc 方法中使用访问器和设置(foo、setFoo:) 是“错误的”。我知道如果这样做,很可能会混淆正在观察该属性的其他对象。 (给出一个简单的例子here https://stackoverflow.com/questions/192721)

不过,我不得不说,我并不认同这种做法,理由如下:

新的 Objective-C 运行时(iPhone 上的运行时和 10.5 中的 64 位运行时)允许您声明属性without声明相应的ivar。例如,以下类可以在 10.5 或 iPhone(设备,而不是模拟器)上正常编译:

@interface Foo : NSObject { }

  @property (retain) id someObject;

@end

@implementation Foo

  @synthesize someObject;

@end

了解上面是一个完全有效的 Objective-C 类,假设我决定编写一个初始化程序,并出于内存管理的目的,编写一个 dealloc 方法(因为 GC 在 iPhone 上不可用)。我读过的有关初始化器和释放的所有内容都会引导我编写以下两个方法:

- (id) init {
  if (self = [super init]) {
    //initialize the value of someObject to nil
    [self setSomeObject:nil];
  }
  return self;
}

- (void) dealloc {
  //setting someObject to nil will release the previous value
  [self setSomeObject:nil];
  [super dealloc];
}

然而,根据文档和流行观点,这是“错误的”。所以我的问题是这样的:

  1. 我应该如何在不使用访问器的情况下初始化 someObject?你可能会说编译器(或运行时或其他什么)将确保 someObject 已经设置为 nil,但我相信依赖它是不正确的行为。拥有良好的 C 背景,我见过相当多的由于未正确初始化变量而导致的错误,这似乎没什么不同。
  2. 如果我不应该在 dealloc 方法中使用访问器,如何释放 someObject?

如果其中任何一个的答案是“你不能”,那么在 init 和 dealloc 方法中使用访问器怎么会不好呢?


编辑(2013 年 2 月 13 日):正如我在下面的评论中所指出的,特别是自从添加 ARC 以来,我对此改变了主意。在 ARC 之前,我看到了很多由于 ivar 分配不正确而导致崩溃的错误init。 IMO,特别是与初级团队合作,在中使用访问器的罕见问题init被 ivar 访问的常见错误所抵消。由于 ARC 已经消除了这些类型的错误,因此在使用访问器时出现的罕见但可能的错误init原因更重要,因此我转而支持直接使用 ivarsinit and dealloc,并且仅在那些地方;在其他可能的地方使用访问器(显然你不能在访问器本身内部使用访问器......)


预弧答案

我强烈不同意那些反对访问器的人-init。几乎在所有情况下,这是使用访问器的一个非常好的地方,并且它可以避免我在新的 Cocoa 编码人员中看到的许多错误,这些编码人员在分配时总是无法保留-init.

-dealloc这是一个更艰难的决定。我自然倾向于在那里使用访问器(以便它们随处使用),但它可能会因 KVO(甚至 NSNotifications,如果您在 setter 中发布更改通知)而引起头痛。也就是说,虽然我不使用访问器-dealloc,我认为这是非常有争议的,苹果对此非常不一致(我们知道他们正在打电话setView:在 UIViewController 中-dealloc例如)。

无论如何,我想说访问器使用不足所导致的错误是过度使用的错误的 100 倍。我总是会错误地使用它们,除非有充分的理由不这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 init 和 dealloc 方法中有效使用访问器? 的相关文章

  • Magento:设置刚刚创建的网站的配置值?

    我正在以编程方式创建网站 用户等 问题是 创建网站时 我无法立即设置配置值 Code
  • 使用按计数分组的核心数据获取属性

    这是我想为 Core Data 编写的查询的 SQL 版本 SELECT Group Name COUNT Item Name FROM Item INNER JOIN Group ON Item GroupID Group ID GROU
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 使用 iPhone 控制蓝牙音频设备

    我正在寻找为 iPhone 编写应用程序 它将能够控制汽车中的收音机和 CD 播放器 收音机和播放器具有可用的蓝牙连接 我开始这个问题是为了获得这个地方所需的所有信息 我有几个问题 但如果您发现任何我没有要求的对我开始开发此应用程序不重要的
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 返回一个dispatch_async获取的变量[重复]

    这个问题在这里已经有答案了 基本上 一个方法需要返回一个在dispatch async中获取的NSDictionary 这是我尝试过的 NSDictionary fetchNSDictionary dispatch queue t Queu
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • NSOperation 中委托的使用

    我正在尝试利用CLLocationManager in an NSOperation 作为其中的一部分 我需要能够startUpdatingLocation然后等到收到 CLLocation 后才完成操作 目前我已经完成了以下操作 但是委托
  • Xcode 4 调试器代码完成

    首先 很高兴他们尝试在 Xcode 4 中的 gdb 命令提示符上完成代码 但在当前状态下 它使得使用命令提示符来调查目标 c 对象几乎不可能 当我打字时 它自动将单词补全为我不想要的内容 并且如果不手动选择文本并将其删除 然后重新开始 则
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 将捕获的图像精确裁剪为 AVCaptureVideoPreviewLayer 中的外观

    我有一个使用 AV Foundation 的照片应用程序 我使用 AVCaptureVideoPreviewLayer 设置了一个预览层 它占据了屏幕的上半部分 因此 当用户尝试拍照时 他们只能看到屏幕上半部分看到的内容 这很好用 但是当用
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 iOS 数据存储指南 下一步 请验证只有用户使用您
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • UISlider不会自动重绘

    我的应用程序上有一个 UISlider 有时我不仅需要更新它的值 还需要更新它的minimumValue 值已更改 但如果我调用 setValue 方法或为滑块分配新值 它会具有新值 但滑块不会将自身重新绘制到该新值应有的位置 我怎样才能重
  • 将父控件的属性传递给子控件

    我正在为特定应用程序开发一组自定义控件 我想定义对于外观目的的控件集通用的属性 为了论证 让我们这样做CustomCtrl AccentColor 我想为我的 Windows 窗体定义相同的属性 即Form1 AccentColor当我更改
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • 在成为FirstResponder或resignFirstResponder的情况下将对象保持在键盘顶部?

    我目前在键盘顶部有一个 UITextField 当您点击它时 它应该粘在键盘顶部并平滑地向上移动 我不知道键盘的具体时长和动画类型 所以确实很坎坷 这是我所拥有的 theTextView resignFirstResponder UIVie

随机推荐

  • Laravel cookie::forget 不起作用?

    我有这个代码 Cookie forget vendor return Redirect route vendor login 它应该做的是删除供应商 cookie 并将您重定向到登录页面 然而 它实际上并没有删除 cookie 根据我的理解
  • Laravel hasOne 通过数据透视表

    所以我有2种模式 User和Profile 关系设置如下 User belongs to many Profile return Illuminate Database Eloquent Relations belongsToMany pu
  • 使用 SetParent 将 HWND 嵌入到外部进程中

    我正在尝试使用以下命令将进程中的窗口嵌入到外部进程的窗口中设置父级功能并遇到了一些问题 首先 以下概述了我当前正在将窗口嵌入到应用程序中的操作 HWND myWindow Handle to my application window HW
  • 将 Ed25519 转换为 RSA 指纹(或如何查找 SSH 指纹)

    BizTalk 将内部 SFTP 测试的指纹视为 ssh rsa 2048 33 88 f0 ff 63 78 a9 2b 3f 09 cb 05 81 db 59 86 WinSCP 显示 ssh ed25519 256 ff 2e 5e
  • jQuery 中的双击功能不起作用

    我在一个页面中有两个 span 元素 当我在两者上调用 jquery 双击函数时 仅在第一个元素上调用该函数 我正在使用以下代码 span 1 span span 1 span jquery 函数是 id shiftTime dblclic
  • Eclipse - @SuppressWarnings("javadoc") 不起作用

    我将 Eclipse 配置为显示有关公共元素缺少 javadoc 注释和标签的警告 这对我来说非常有用 可以很好地记录我的代码 但有时我有一堂课 其中有几个常量描述例如 DFA 的状态或其他东西 不需要记录这些常量 因为它们是不言自明的 所
  • JIRA 插件:从哪里开始

    我被要求创建一个简单的 JIRA 插件 它结合了工作流程 自定义字段 条件步骤 我刚刚开始安装 JIRA 并最终成功创建了一个运行简单的 Hello World 插件 我已经对这个界面有多大感到困惑 似乎无法掌握大局 你们中的任何人都可以带
  • 用于在 C 中重命名文件的 Win32 API

    如果源目录和目标目录 MoveFile 实际上会将源文件复制到目标文件中 这意味着我最终会看到两个文件 这是实现重命名的最佳方式吗 The MoveFile http msdn microsoft com en us library aa3
  • SQL死锁问题

    在关系数据库中这两条语句有可能死锁吗 我试图简化我的问题和示例 请假设这些选择 我认为通常只需要可共享读锁定 现在需要独占读锁 Concurrent Connection 1 SELECT FROM A JOIN B ON Concurre
  • ADO Recordset 到 Excel 电子表格在 Excel 2007 中正确打开,但在 Excel 2013 中缺少参数

    我的电子表格正在使用 ADO 从另一个电子表格读取数据 VBA 代码在 MS Excel 2007 中正常工作 但是 在 MS 2013 中 打开记录集会生成错误 No value given for one or more require
  • 快速排序和霍尔分区

    我很难将带有 Hoare 分区的 QuickSort 翻译成 C 代码 并且无法找出原因 我正在使用的代码如下所示 void QuickSort int a int start int end int q HoarePartition a
  • 计算套接字上传速度

    我想知道是否有人知道如何用 C 计算 Berkeley 套接字的上传速度 我的send调用不会阻塞 发送 5 MB 数据需要 0 001 秒 但需要一段时间才能发送recv响应 所以我知道它正在上传 这是一个到 HTTP 服务器的 TCP
  • crypto/ssh ParsePublicKey“短读”错误

    在我正在开发的程序中 我需要一种在开发过程中将公钥添加到authorized keys 文件中的方法 因此我使用命令行参数来执行此操作 我省略了大部分代码 但是如果您想查看所有代码 这是存储库 https github com george
  • 元编程:从 boost mpl::vector 中的每个类继承

    我希望继承包含在 boost mpl vector 中的一组类 这可能吗 具体来说 我想延长test对于任意多个模板参数 作为 mpl vector 传递 template
  • 致命:无法连接到 github.com: github.com[0: 140.82.121.4]: errno=未知错误

    我的 Git 帐户有问题 每次我执行git push 我收到以下错误 我发现我正在使用 SSH URL 我尝试使用以下命令切换回 HTTPS URL git config global url https github com instea
  • 如何在 Tensorflow 2.0 中使用 K.get_session 或如何迁移它?

    def init self kwargs self dict update self defaults set up default values self dict update kwargs and update with user o
  • 如何使用新的 AndroidProfiler 处理内存泄漏

    我正在尝试学习如何识别和处理我的应用程序中的内存泄漏 我正在读这个很棒的文章 https medium com freenet engineering memory leaks in android identify treat and a
  • dbo.TempGetStateItemExclusive3 重复调用

    我正在调查我们网站使用 SQL Server 管理会话的问题 该网站是基于 sitecore CMS 的 asp net webforms 我们在不同的环境中都有相同的代码 例如QA 分期和生产 在生产中 我们定期看到 CPU 使用率快速上
  • Chrome 和 Firefox 中的行高不同

    https i stack imgur com 8pGGL png https i stack imgur com 8pGGL png 看起来像是行高的问题 我在 CSS 重置中设置了 line height 1 这似乎是导致问题的原因 然
  • 在 init 和 dealloc 方法中有效使用访问器?

    我现在从多个来源 stackoverflow com cocoa dev 文档 博客等 听说 在 init 和 dealloc 方法中使用访问器和设置 foo setFoo 是 错误的 我知道如果这样做 很可能会混淆正在观察该属性的其他对象