我应该在 ARC 的 init 方法中引用 self.property 吗?

2023-11-26

一个简单的问题。

如果我有一个属性和一个同名声明的 ivar:

在.h文件中:

(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;

在 .m 文件中,如果我使用 ARC,我应该使用 ivar 还是 init 方法中的属性?

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
    }
    return self;
}

或者我应该使用该属性来获得自动引用计数的好处,如下所示:

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        self.reminder = reminder_;
    }
    return self;
}

我不确定在对象初始化的哪个点可以使用点符号访问属性。


无论 ARC 如何,都在部分构造状态下使用直接访问:

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
        // OR
        reminder = [reminder_ retain];
    }
    return self;
}

这是因为self.whatever将触发其他副作用,例如键值观察(KVO)通知,或者您的类可能(显式)实现或子类覆盖setWhatever:——这可能会将部分初始化的实例暴露给其他 API(包括它自己的 API),这些 API 正确地假设它们正在处理一个完全构造的对象。

You could手动验证一个类是否能够在部分初始化的状态下运行,但这需要大量维护,并且(坦率地说)当其他人想要对您的类进行子类化时,这是不切实际或不可能的。它需要大量的时间和维护,并且这样做没有实质性的好处,特别是如果您尝试使用该方法作为约定。

因此保证正确性的统一方式是在部分构造的状态下使用直接访问,并避免使用访问器。

注意:我使用“部分构造”,因为初始化只是图片的一半;-dealloc有类似的警告。

关于为什么应该在部分构造状态(ARC || MRC)中使用直接访问的更多详细信息可以在这里找到:初始化属性,点符号

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

我应该在 ARC 的 init 方法中引用 self.property 吗? 的相关文章

随机推荐

  • 如何创建和使用ASP.NET vNext类库NuGet包?

    我想创建 ASP NET vNext 类库的 NuGet 包 我该怎么做 一步一步 我明白有kpm build 但我找不到关于在哪里下载 kpm 等的指南 另外 在获得它的 NuGet 包 或 DLL 后 如何将其从本地计算机添加到我的 v
  • 如何快速更新Google云存储上的静态站点?

    我有一个托管在谷歌云存储上的静态网站 我按照此处描述的相同方法进行设置 https cloud google com storage docs hosting static website 我已经购买了一个域名 目前网站运行顺利 我仍在更改
  • Asp.Net (MVC):哪个会话超时是什么?

    我制作了一个 Asp net MVC 网站 我对不同的超时设置感到非常困惑 有什么区别 web config 中的 SessionState 超时 应用程序池超时 Asp Net 会话超时属性 如果我想要 例如 6 小时的超时 我应该设置哪
  • PyQt4 - 从 QListWidget 中删除项目小部件

    我有一个 QListWidget 我需要删除一些项目 根据我的研究 这通常是一件令人不愉快的事情 我已经阅读了大量的解决方案 但没有一个适用于我的特定场景 目前 我只有实际的 Item Widgets 需要处理 不是它们的值或索引 这是因为
  • Visual Studio 忽略 #if DEBUG / RELEASE 范围内的代码,并且不检查错误或自动完成

    我一直在写一个 if DEBUG else endif代码片段 我注意到 Visual Studio 不允许我使用自动完成来完成部分键入的成员名称 并且它不会检查灰显的非活动代码是否有错误 我发现让它再次受到关注的唯一方法是将构建模式从 调
  • 在 LESS 中引用具有多层嵌套的父级

    我有以下较少 container column columns one width 40px 当我编译时 我的 CSS 得到以下内容 one container column one container columns width 40px
  • 在 Apache Spark Join 中包含空值

    我想在 Apache Spark 连接中包含空值 默认情况下 Spark 不包含带有 null 的行 这是默认的 Spark 行为 val numbersDf Seq 123 456 null toDF numbers val letter
  • ASP.net 中的 SendEmail 显示语法错误,命令无法识别。服务器响应是:Dovecot 就绪

    我想使用 ASP NET 发送邮件 代码如下 public void Semail string subject string messageBody string toAddress MailMessage mail new MailMe
  • 从 CGImageRef 创建的 UIImage 失败并显示 UIImagePNGRepresentation

    我使用以下代码从较大的 UIImage 中裁剪并创建一个新的 UIImage 我已将问题与函数 CGImageCreateWithImageInRect 隔离开来 该函数似乎没有按照我想要的方式设置某些 CGImage 属性 问题是调用函数
  • java - 通过引用传递双精度值

    如何在java中通过引用传递双精度值 example Double a 3 0 Double b a System out println a a b b a 5 0 System out println a a b b 此代码打印 a 3
  • 停止单个 UICollectionView 单元格流向屏幕中心

    我试图理解为什么集合视图仅将集合中的最后一个单元格居中对齐 我创建了一个简单的基于流布局的集合视图 我正在使用自动布局标志 我不确定是否会导致此问题 每当我从 集合 视图中删除一个单元格时 前几个单元格似乎工作正常并滚动到左侧 然而 当我删
  • 带有命令行 Blender 参数的 Python 脚本

    我是搅拌机和蟒蛇的新手 我有一个搅拌机模型 blend 我想将其批量渲染为多个图像 为每个图像提供一些属性 我用这些参数编写了一个 python 脚本 如下所示 import bpy pi 3 14159265 fov 50 scene b
  • 像素着色器效果示例

    我见过许多像素着色器效果示例 例如图像上的漩涡 但我想知道是否有人知道有关着色器效果的更实际用途的任何示例或教程 我并不是说漩涡效果没有它的用 途 只是我发现的许多示例都解释了基本效果 并且没有深入探讨如何巧妙地将其与另一种效果一起使用或过
  • powershell invoke-webrequest 登录网站

    我使用 invoke webrequest 登录网站取得了很大的成功 但我很困惑 我正在尝试登录https ctslink com or https direct ctslink com 登录表单有一个隐藏的令牌字段 每次我尝试登录时该字段
  • 填充 SVG 的一定百分比并设置填充动画

    目前 我正在开展一个项目 将州数据与另一个国家的数据进行比较 一个数据点是受保护土地的百分比 我想填写与该数据点匹配的州的百分比 例如 如果北卡罗来纳州 25 的地区受到保护 那么我希望该州 25 的地区得到保护 目前 我正在尝试使用 sv
  • Google GWT 跨浏览器支持:是废话吗?

    我在 FlashBuilder 中开发了一个浏览器部署的全文搜索应用程序 它与远程 Web 服务器进行 REST 通信 该软件适合一个很小的利基市场 它用于古代语言而不是现代语言 我不可能在它上面赚到任何钱 但我确实花了很多时间在它上面 现
  • Unicode 到 UTF-8

    我正在使用 vbscript 从 db2 提取数据并写入文件 写入文件如下 Set objTextFile objFSO CreateTextFile sFilePath True True 以 unicode 创建文件 但那是 xml 文
  • 如何将 android.graphics.Color 转换为 androidx.compose.ui.graphics.Color

    我正在绘制 Jetpack ComposeCanvas Canvas modifier modifier clipToBounds val colorEvaluator ArgbEvaluator colorEvaluator evalua
  • Inno Setup:如何更改背景颜色

    有没有办法将 Inno Setup 底部面板的背景颜色更改为白色 感谢您的帮助 您描述的底部面板实际上是向导表单的区域 因此您只需设置Color的财产WizardForm对象本身 Code procedure InitializeWizar
  • 我应该在 ARC 的 init 方法中引用 self.property 吗?

    一个简单的问题 如果我有一个属性和一个同名声明的 ivar 在 h文件中 Reminder reminder property nonatomic strong Reminder reminder 在 m 文件中 如果我使用 ARC 我应该