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;

推荐使用,性能更高。

相关推荐
AIsoft_868811 小时前
iOS端录音转文字工具实测:自媒体创作者高效整理指南
ios·媒体
库奇噜啦呼18 小时前
【iOS】Core Data
ios
2501_915106321 天前
TraceEagle 代理抓包教程 本机和手机的 HTTPS 抓包方法
网络协议·计算机网络·网络安全·ios·adb·https·udp
云逸_2 天前
Cinder:基于 Swift Macro 与 Mach-O Section 的解耦注册机制
ios·swift
末代iOS程序员华仔2 天前
从 Figma 到上架:使用 Codex 与 MCP 全流程实现 AI 聊天 App
flutter·ios·swift
极客猴子2 天前
苹果手机怎么快速总结长文本?iOS录音APP实测对比
ios·智能手机
一牛2 天前
Swift 循环引用
macos·ios
Mh2 天前
程序员和非程序员使用 AI 进行编程的区别究竟在哪里?
前端·javascript·xcode
迷雾悠悠2 天前
企业微信iPad协议聚合聊天系统:从原理到实战开发指南
ios·企业微信·ipad
LDyun_3 天前
.2026主流云手机测评,8款机型高压挂机实测
ios·智能手机·安卓·玩游戏