iOS开发进阶:深入理解 Getter 与 Setter 的用法(超详细)

前言

在 iOS 开发中,@property 几乎每天都在使用,但很多开发者对 getter 和 setter 的本质以及高级用法理解并不深入。

本文将从基础到进阶,系统讲解 getter 和 setter 的使用方式、底层原理以及常见面试问题。

一、什么是 Getter 和 Setter

Getter 和 Setter 是用于访问属性的两个方法。

  • Getter:用于获取属性值
  • Setter:用于设置属性值

1.基本示例

复制代码
@property(nonatomic, strong) NSString *name;

编译器会自动生成:

复制代码
- (NSString *)name;
- (void)setName:(NSString *)name;

2.调用方式

复制代码
self.name = @"Tom";
NSString *n = self.name;

本质等价于:

复制代码
[self setName:@"Tom"];
NSString *n = [self name];

二、Getter 和 Setter 的本质

@property 本质是语法糖,等价于:

复制代码
@interface Person : NSObject {
    NSString *_name;
}
- (NSString *)name;
- (void)setName:(NSString *)name;
@end

编译器会自动完成:

  1. 成员变量生成(如 _name
  2. getter 和 setter 方法实现
  3. 内存管理(ARC 环境下)

三、自定义Getter和Setter

1.自定义Getter

复制代码
@property(nonatomic, assign, getter=isSingle) BOOL single;

生成:

复制代码
- (BOOL)isSingle;
- (void)setSingle:(BOOL)single;

这样可以让代码更符合语义:

复制代码
if (self.isSingle) {
}

2.自定义Setter

复制代码
@property(nonatomic, assign, setter=setAgeValue:) int age;

生成:

复制代码
- (int)age;
- (void)setAgeValue:(int)age;

3. 同时自定义 Getter 和 Setter

复制代码
@property(nonatomic, assign, getter=isVIP, setter=setVIPStatus:) BOOL vip;

生成:

复制代码
- (BOOL)isVIP;
- (void)setVIPStatus:(BOOL)vip;

四、手动实现 Getter 和 Setter

1.Getter(懒加载)

复制代码
- (NSMutableArray *)dataArray {
    if (!_dataArray) {
        _dataArray = [NSMutableArray array];
    }
    return _dataArray;
}

2.Setter(数据处理)

复制代码
- (void)setName:(NSString *)name {
    _name = [name uppercaseString];
}

3.Setter正确写法

复制代码
- (void)setName:(NSString *)name {
    if (_name != name) {
        _name = [name copy];
    }
}

注意:

  • 不要使用 self.name = name,否则会导致递归调用
  • 应直接操作成员变量 _name

五、属性修饰符对Setter的影响

1.strong

复制代码
@property(nonatomic, strong) NSObject *obj;

本质是强引用赋值。

2.copy

复制代码
@property(nonatomic, copy) NSString *str;

本质:

复制代码
_str = [str copy];

用于防止外部修改可变对象。

3.assign

复制代码
@property(nonatomic, assign) int age;

直接赋值。

4. weak

复制代码
@property(nonatomic, weak) id delegate;

不会增加引用计数,对象释放后自动置为 nil。

六、readonly 与 readwrite

1.readonly

复制代码
@property(nonatomic, readonly) NSString *name;

只生成 getter 方法。

2.readwrite

默认属性,生成 getter 和 setter。

3. 私有 Setter 技巧

复制代码
// .h
@property(nonatomic, strong, readonly) NSString *name;

// .m
@property(nonatomic, strong, readwrite) NSString *name;

对外只读,对内可写。

七、atomic 与 nonatomic

1. atomic

默认属性,保证线程安全,但性能较低。

2. nonatomic

复制代码
@property(nonatomic, strong) NSString *name;

推荐使用,性能更高。

相关推荐
songgeb2 天前
启发式 UI 自动化:从线性剧本到每步读屏决策
ios·测试
壹方秘境5 天前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
初级代码游戏11 天前
easy Photo Clean公测版:快速清理iPhone照片 邀请公测
ios·iphone
库奇噜啦呼11 天前
【iOS】RunLoop学习
学习·ios
黑科技iOS上架11 天前
iOS应用周末提交什么情况算卡审
经验分享·ios
zzb158011 天前
ios基础-MVC-UIView
ios·mvc·cocoa
kingbal11 天前
Flutter:Flutter SDK版本管理工具FVM
android·flutter·ios·android-studio·window
他们都不看好你,偏偏你最不争气12 天前
【iOS】Runtime - Part 2 && 消息发送:缓存、查找与转发
macos·ios·objective-c·cocoa
2501_9159184112 天前
iOS App性能测试工具的实现方法与优化循环指南
android·ios·小程序·https·uni-app·iphone·webview