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

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

理由:

  • 避免子类覆盖setter方法的影响:若在初始化方法中使用setter方法, 使用此方法实例化子类, 可能会调用子类重写的setter方法,这可能会导致意想不到的行为。在初始化期间,应该避免这种情况,以确保对象处于一个稳定和预期的状态。
objc 复制代码
// 假设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)通知、或者执行自定义的逻辑。如果在初始化或销毁过程中使用这些方法,可能会导致一些未定义行为或者不必要的操作。

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

具体实现:

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

objc 复制代码
@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, 否则总是应该直接访问

相关推荐
茶底世界之下2 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_916007472 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
2501_916008892 天前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915909062 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916008892 天前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
2501_915918413 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
终端安全笔记3 天前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
9765033353 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
黑化旺仔4 天前
【OC】KVO
macos·ios·objective-c·cocoa
HouWan4 天前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple