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;

推荐使用,性能更高。

相关推荐
2501_9160088915 小时前
深入解析iOS应用启动性能优化策略与实践
android·ios·性能优化·小程序·uni-app·cocoa·iphone
美狐美颜SDK开放平台16 小时前
短视频/直播双场景美颜SDK开发方案:接入、功能、架构详解
android·ios·美颜sdk·第三方美颜sdk·视频美颜sdk
库奇噜啦呼16 小时前
【iOS】内存对齐原理
macos·ios·cocoa
SameX1 天前
我做了个专注 App,把连续打卡阈值从 3/7/14 改成 2/5 之后留存明显好了
ios
pop_xiaoli1 天前
【iOS】分类、关联对象
ios·分类·数据挖掘·objective-c·cocoa
Mr -老鬼1 天前
EasyClick iOS版 CLI 与 Trae iOS版智能体
ios·自动化·ai编程·tare·ec·easyclick·易点云测
wechatbot8881 天前
企业微信 iPad 协议接口全功能开发实战
汇编·人工智能·ios·微信·企业微信·ipad
Digitally1 天前
如何将视频从 iPhone 传输到电脑
ios·电脑·iphone