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;

推荐使用,性能更高。

相关推荐
MonkeyKing6 小时前
iOS 深入理解 UIView 与 CALayer:关系、渲染流程与坐标系
ios
君子木6 小时前
解决ios App的webview不支持<video>标签行内播放的问题(点击播放按钮后会直接全拼播放)
ios
游戏开发爱好者86 小时前
iOS应用性能监控:Pre-Main与Main函数耗时分析及Time Profiler使用教程
android·ios·小程序·https·uni-app·iphone·webview
UXbot8 小时前
AI 原型工具对比(2026):从文字描述到完整 App 界面的 5 款主流平台评测
android·前端·ios·交互·软件构建
sakiko_9 小时前
Swift报错合集(Xcode编译器)
开发语言·swiftui·xcode·swift·uikit
人月神话-Lee21 小时前
【图像处理】亮度与对比度——图像的线性变换
图像处理·人工智能·ios·ai编程·swift
AITOP1001 天前
高德联合千问开源AGenUI:让Agent UI同时跑在iOS、安卓和鸿蒙上
ui·ios·开源
2501_916008891 天前
ChatGPT前端开发学习指南:Visual Studio Code与谷歌浏览器安装配置详解
ide·vscode·ios·小程序·uni-app·编辑器·iphone
MonkeyKing1 天前
iOS 图片内存优化实战:解码、downSample、纹理内存与大图展示全解析
ios
00后程序员张1 天前
iOS开发中Xcode安装不完整问题解决方案与配置指南
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程