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;

推荐使用,性能更高。

相关推荐
小雨下雨的雨1 小时前
iOS风格计算器 - 鸿蒙PC Electron框架上的技术实现详解
游戏·ios·华为·electron·harmonyos·鸿蒙
人月神话Lee4 小时前
【图像处理】一文带你窥探近期火热图像App的主要实现原理:主色提取——从图像到调色板
ios·ai编程·图像识别
2601_955767421 天前
iPhone 17 全系屏幕光学特性与保护膜选型技术分析
ios·ar·iphone·圆偏振光护眼·iphone17护眼钢化膜·#观复盾护景贴
2501_915909061 天前
深入解析Mock.js:功能、应用及实战案例,提升前端开发效率
android·ios·小程序·https·uni-app·iphone·webview
pop_xiaoli1 天前
【iOS】通知传值实现
macos·ios·xcode
2601_955767421 天前
iPhone 17 屏幕偏振光学解析与保护贴技术选择——悟赫德观复盾护景贴
人工智能·科技·ios·ar·iphone·圆偏振光
qq3621967051 天前
手机App下载安装完全指南:2026最新教程(Android & iOS)
android·ios·智能手机
核电机组1 天前
IOS原生APP集成Flutter
flutter·ios