当前位置: 首页 > news >正文

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, 否则总是应该直接访问

相关文章:

  • svnadmin备份和还原
  • 大模型训练的艺术:从预训练到增强学习的四阶段之旅
  • 数字IC必备知识点:【0】文章汇总
  • 爱德华三坐标软件ACdmis.AC-dmis密码注册机
  • 大模型开发Semantic Kernel 简介
  • java版多语言抢单系统 多语言海外AEON抢单可连单加额外单源码 抢单平台搭建开发 抢单开挂的软件
  • Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息
  • MySQL-数据处理(1)
  • Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.3 从零移植 busybox,基于RISC-V
  • 一文者懂LLaMA 2(原理、模型、训练)
  • 大模型日报2024-06-10
  • [flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本
  • REACT (Web开发框架 : react)极速入门
  • 《云原生安全攻防》-- 容器环境下的攻击行为
  • 6月7号作业
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Android框架之Volley
  • Git 使用集
  • Laravel Telescope:优雅的应用调试工具
  • nginx 配置多 域名 + 多 https
  • spring + angular 实现导出excel
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • ⭐ Unity + OpenCV 实现实时图像识别与叠加效果
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 检测对象或数组
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 力扣(LeetCode)965
  • 普通函数和构造函数的区别
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 推荐一个React的管理后台框架
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 新版博客前端前瞻
  • #传输# #传输数据判断#
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (Oracle)SQL优化技巧(一):分页查询
  • (分享)自己整理的一些简单awk实用语句
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (每日一问)基础知识:堆与栈的区别
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十八)Flink CEP 详解
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (转)3D模板阴影原理
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .Net 6.0--通用帮助类--FileHelper
  • .NET Core跨平台微服务学习资源
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 表达式计算:Expression Evaluator
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net和jar包windows服务部署
  • .net和php怎么连接,php和apache之间如何连接