type
status
date
slug
summary
tags
category
icon
password
1. 属性声明语法
在Objective-C中,属性使用@property关键字声明,基本语法如下:
2. 属性特质(Property Attributes)
原子性
- atomic - 是属性的默认特质,它的特点是:
- 保证getter和setter方法都是原子操作,即一次只能有一个线程访问
- 提供基本的线程安全保障
- 但会带来性能开销
举个例子来说明:
这就像一个带锁的房间,一次只能让一个人进去存取东西。虽然安全,但是需要排队等待,效率较低。
- nonatomic - 是iOS开发中更常用的特质,特点是:
- 不保证getter和setter的原子性
- multiple线程可以同时访问
- 性能更好,因为没有锁的开销
- 如果你的属性不需要考虑多线程访问问题,建议使用nonatomic
- 如果确实需要线程安全,可以使用atomic,但最好配合其他同步机制一起使用
用同样的比喻:
这就像一个没有锁的房间,多个人可以同时进出。速度快但需要开发者自己确保线程安全。
在实际开发中:
读写权限
- readonly - 只读属性,只生成getter方法
- readwrite - 可读写属性,生成setter和getter方法(默认)
内存管理
- strong - 强引用,适用于你需要长期持有并管理的对象,就像牢固的绳子把对象拴住。
例如:
@property (nonatomic, strong) UIView *mainView;这里mainView会牢牢持有这个视图,直到我们主动解除关系
- weak - 弱引用,适用于防止循环引用,或不需要持有对象生命周期的场景。
例如:
@property (nonatomic, weak) id<MyDelegate> delegate;delegate对象随时可能消失,当它消失时,这个属性会自动变为nil,避免悬挂指针
- assign - 适用于基本数据类型,就像在纸上记录一个数字。
例如:
@property (nonatomic, assign) NSInteger count;这里的count就是简单的数值存储,不需要考虑内存管理
- copy - 创建独立副本,适用于需要保持数据不可变性的场景,像是复印一份文件。
例如:
@property (nonatomic, copy) NSString *userName;即使外部的字符串被修改,userName保存的依然是当时复制的那个版本
关键区别:
- strong:对象会一直存在,直到持有它的属性释放
- weak:对象可能随时被释放,属性会自动置为nil
- assign:简单的值传递,不涉及内存管理
- copy:创建独立的副本,确保数据不会被外部修改
setter语义
- retain - ARC下已被strong替代
- unsafe_unretained - 类似assign,但用于对象类型
3. 属性实例示例
4. 最佳实践
- 对象类型通常使用strong或weak特质
- NSString、NSArray、NSDictionary等经常使用copy特质
- delegate属性通常声明为weak,避免循环引用
- 基本数据类型使用assign特质
5. 属性合成
编译器会自动生成属性的实现代码,包括:
- 生成带下划线的实例变量(_propertyName)
- 生成setter和getter方法
- 可以使用@synthesize自定义实例变量名
6. 注意事项
- 在多线程环境下,要注意属性的原子性
- 使用copy特质时,确保对象遵循NSCopying协议
- 避免在init和dealloc方法中使用访问器方法
- 合理使用内存管理特质,防止内存泄漏
- Author:akinIan
- URL:blog.akinaustin.space/article/1e5e7ea2-ebf7-805e-a000-ebc240f7f001
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!



