Objective-C的初始化方法中,应该如何读写属性

在这里插入图片描述

除非有明确的原因需要使用setter, getter, 否则总是应该直接访问, 也就是直接使用实例变量(也称为 iVar)来读写数据

理由:

  • 避免子类覆盖setter方法的影响:若在初始化方法中使用setter方法, 使用此方法实例化子类, 可能会调用子类重写的setter方法,这可能会导致意想不到的行为。在初始化期间,应该避免这种情况,以确保对象处于一个稳定和预期的状态。
// 假设SQIPerson有一个子类叫做SQISmithPerson, 专门表示那些姓"Smith"的人, 重写了 lastName 属性对应的设置方法
- (void)setLastName:(NSString *)lastName {if (![lastName isEqualToString:@"Smish"]) {[NSException raise:NSInvalidArgumentException format:@"Last name must be Smith"];}[super setLastName:lastName]; // 使用super调用父类的setter方法, 而不是self.lastName = lastName;
}
  • 属性的 setter 方法可能依赖于对象的其他部分:在 init 方法中,对象可能还没有完全初始化,依赖于对象其他部分的 setter 方法可能会引发错误或不一致的状态。

  • 属性的 getter 和 setter 方法可能包含副作用:属性的 getter 和 setter 方法通常会做一些额外的工作,比如通知观察者、触发 KVO(Key-Value Observing)通知、或者执行自定义的逻辑。如果在初始化或销毁过程中使用这些方法,可能会导致一些未定义行为或者不必要的操作。

  • 性能考虑:直接访问实例变量比通过属性访问更高效,因为它避免了方法调用的开销。在性能敏感的场合,尤其是在对象初始化和销毁过程中,直接访问实例变量可以提高性能。

具体实现:

在初始化方法中直接访问实例变量,可以确保初始化逻辑的简单和明确,不会受到继承层次结构中的其他因素影响。

@interface MyClass : NSObject@property (nonatomic, strong) NSString *propertyName;@end@implementation MyClass- (instancetype)init {self = [super init];if (self) {_propertyName = @"initialValue"; // 直接访问实例变量}return self;
}@end

在这个例子中,_propertyName 是实例变量,直接访问它可以避免调用任何潜在的子类重写的setter方法。

哪些特殊情况, 必须使用或者不得不使用setter, getter ?

  • 待初始化的实例变量声明在超类中
  • lazy initialization

在 dealloc 方法中, 应该如何读写实例变量 ?

同 init 方法, 建议: 除非有明确的原因需要使用setter, getter, 否则总是应该直接访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349122.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即插即用!CVD:第一个生成具有相机控制的多视图一致视频方案!(斯坦福港中文)

论文链接:https://arxiv.org/abs/2405.17414 项目链接:https://collaborativevideodiffusion.github.io/ 最近对视频生成的研究取得了巨大进展,使得可以从文本提示或图像生成高质量的视频。在视频生成过程中添加控制是未来的重要目标&#x…

ARM32开发--IIC软实现

知不足而奋进 望远山而前行 目录 文章目录 前言 开发流程 GD32F4软件I2C初始化 GD32F4软件I2C引脚功能 写操作 读操作 总结 前言 在嵌入式系统开发中,软件实现的I2C通信协议扮演着至关重要的角色。本文将深入探讨如何在GD32F4系列微控制器上实现软件I2C功能…

.NET MAUI Sqlite程序应用-数据库配置(一)

项目名称:Ownership(权籍信息采集) 一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、创建多个表及相关字段 Models\OwnershipItem.cs using SQLite;namespace Ownership.Models {public class fa_rural_base//基础数据…

湖仓一体全面开启实时化时代

摘要:本文整理自阿里云开源大数据平台负责人王峰(莫问)老师在5月16日 Streaming Lakehouse Meetup Online 上的分享,主要介绍在新一代湖仓架构上如何进行实时化大数据分析。内容主要分为以下五个部分: Data Lake Dat…

java线程池讲解!核心参数

创建方式 | 构造方法 Executor构造方法 存放线程的容器&#xff1a; private final HashSet<Worker> workers new HashSet<Worker>(); 构造方法&#xff1a; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit uni…

vue页面和 iframe多页面无刷新方案和并行存在解决方案

面临问题 : back的后台以jsp嵌套iframe为主, 所以在前端框架要把iframe无刷新嵌套和vue页面进行并行使用,vue的keep-alive只能对虚拟dom树 vtree 进行缓存无法缓存iframe,所以要对iframe进行处理 tab标签的切换效果具体参考若依框架的tab切换,可以去若依看源码,若依源码没有实…

NodeClub:NodeJS构造开源交流社区

NodeClub&#xff1a; 连接每一个想法&#xff0c;NodeClub让社区更生动- 精选真开源&#xff0c;释放新价值。 概览 NodeClub是一个基于Node.js和MongoDB构建的社区系统&#xff0c;专为开发者和社区爱好者设计。它提供了一套完整的社区功能&#xff0c;包括用户管理、内容发…

进击算法工程师深度学习课程

"进击算法工程师深度学习课程"旨在培养学员在深度学习领域的专业技能和实战经验。课程涵盖深度学习基础理论、神经网络架构、模型优化方法等内容&#xff0c;通过项目实践和算法实现&#xff0c;帮助学员掌握深度学习算法原理和应用&#xff0c;提升在算法工程师领域…

在k8s中部署Elasticsearch高可用集群详细教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

Unity EasyRoads3D插件使用

一、插件介绍 描述 Unity 中的道路基础设施和参数化建模 在 Unity 中使用内置的可自定义动态交叉预制件和基于您自己导入的模型的自定义交叉预制件&#xff0c;直接创建独特的道路网络。 添加额外辅助对象&#xff0c;让你的场景栩栩如生&#xff1a;桥梁、安全护栏、栅栏、墙壁…

03 SpringBoot 的工作原理

1.Spring Boot 的执行流程 Spring Boot 的执行流程主要分为两步&#xff1a; 初始化Spring Application实例 查看classpath类路径webApplicationType下是否存在某个特征类获取所有可用的应用初始化器类ApplicationContextInitializer获取所有可用的监听器类ApplicationListene…

【并集查找】839. 相似字符串组

本文涉及知识点 并集查找&#xff08;并差集) 图论知识汇总 LeetCode839. 相似字符串组 如果交换字符串 X 中的两个不同位置的字母&#xff0c;使得它和字符串 Y 相等&#xff0c;那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的&#xff0c;那它们也是相似的。…

HarmonyOS(36) DevEco Studio 配置debug和release

在android开发中可以在build.gradle来配置realease和debug,在HarmonyOS中可以通过build-profile.json5文件中通过buildModeSet配置&#xff1a; 在DevEco Studio 中可以通过下面来选择运行debug还是release&#xff1a; 我们可以通过BuildProfile.ets里面的静态变量获取当前…

全球经典智能仓储物流系统--大集锦

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 一、引言 在全球物流行业高速发展的今天&#xff0c;智能仓储物流系统已成为提升物流效率、降低成本的关键。 以下将详细介绍几种全球经…

在AI云原生时代应该如何应对复杂的算力环境

引言 随着在2019年ChatGPT4的爆火,AI这个之前常常被人觉得非常高深的技术渐渐的被越来越多的人们所了解,越来越多的公司、组织和开发者开始投入AI的使用和开发中来.随着AI和LLM的火热,算力资源也变的越来越紧缺,所以如何高效的管理和使用算力资源也变成了必须要面对的问题。 …

电池包断路单元DBU的预充电电阻应用案例

当电池组接触器闭合到电机和逆变器上时&#xff0c;逆变器电容器中会有电流涌入。这种非常高的电流至少可能会使接触器老化&#xff0c;并可能永久损坏接触器。 因此&#xff0c;当我们关闭电池组上的接触器时&#xff0c;我们分三个步骤执行此操作&#xff1a; 1.关闭主负极…

2024中国网络安全产品用户调查报告(发布版)

自2020年始&#xff0c;人类进入了21世纪的第二个十年&#xff0c;全球进入了百年未有之大变局&#xff0c;新十年的开始即被新冠疫情逆转了全球化发展的历程&#xff0c;而至2022年3月俄乌战争又突然爆发&#xff0c;紧接着2023年7月“巴以冲突"皱起&#xff0c;世界快速…

【StableDiffusion】Embedding 底层原理,Prompt Embedding,嵌入向量

Embedding 是什么&#xff1f; Embedding 是将自然语言词汇&#xff0c;映射为 固定长度 的词向量 的技术 说到这里&#xff0c;需要介绍一下 One-Hot 编码 是什么。 One-Hot 编码 使用了众多 5000 长度的1维矩阵&#xff0c;每个矩阵代表一个词语。 这有坏处&#xff0c…

通过Stream流对集合进行操作

Stream Api是JDK8提供的新特性&#xff0c;可以更为方便地对集合进行操作&#xff0c;比如我今天遇到的一个场景&#xff1a; 将本地的一个视频文件分成多块上传到Minio服务器&#xff0c;现在上传功能已经完成&#xff0c;需要调用minioClient对已经上传的文件重新合并成一个新…

[大模型]Phi-3-mini-4k-instruct langchain 接入

环境准备 在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器&#xff0c;如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。 接下来打开刚刚租用服务器的 JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载和运行演示。 创建工作…