atomic/nonatomic/retain/assign/copy

本文深入探讨了Objective-C中的atomic与nonatomic的区别,解释了它们如何影响线程安全及性能,并强调了在使用property时选择nonatomic的原因。

atomic/nonatomic/retain/assign/copy

nonatomic vs. atomic 

"atomic" 是默认的,通常使用 "nonatomic".如果使用atomic,如其名,它会保证每次getter和setter的操作都会正确的执行完毕,而不用担心其它线程在你get的时候set,可以说保证了某种程度上的线程安全。但是,我上网查了资料,仅仅靠atomic来保证线程安全是很天真的。要写出线程安全的代码,还需要有同步和互斥机制。

  而nonatomic就没有类似的“线程安全”(我这里加引号是指某种程度的线程安全保证)。因此,很明显,nonatomic比atomic速度要快。这也是为什么,我们基本上所有用property的地方,都用的是nonatomic了。


retain vs. copy vs. assign
"assign" 是默认的使用 @synthesize 创建的 setter 该值将被简单地分配给属性,我的理解是,“分配”应当用于非指针属性。
"retain" 的属性需要的是一个指向对象的指针。@synthesize 所产生的二传手将对象保留(又名添加一个保留计数)。当你完成它,您将需要释放的对象。
"copy" 的属性需要的是一个可变的对象。如果你需要这个对象的当前值,但你不希望这个对象的其他拥有者修改他你可以使用 copy 。当你完成了它,您将需要释放这个对象,因为你保留他的副本。
`@property (nonatomic, assign)` 是 Objective-C 中用于声明属性的关键字组合,用于告诉编译器该属性的**原子性**和**内存管理语义**。 --- ## 🔍 分析:`@property (nonatomic, assign) long familyId;` ### ✅ `@property` - 是 Objective-C 中用于声明属性的语法糖。 - 编译器会自动为你生成: - **getter 方法**(如 `- (long)familyId;`) - **setter 方法**(如 `- (void)setFamilyId:(long)familyId;`) --- ### ✅ `nonatomic` - 表示这个属性是**非原子性的**(non-atomic)。 - 不保证线程安全。 - 访问速度更快,适合在单线程或你已经控制访问方式的情况下使用。 | 修饰符 | 是否线程安全 | 说明 | |--------|---------------|------| | `atomic` | ✅ 是,默认值 | 保证线程安全,性能略差 | | `nonatomic` | ❌ 否 | 不保证线程安全,性能更好,推荐使用 | --- ### ✅ `assign` - 表示这个属性使用**赋值**的方式进行内存管理。 - 不会增加引用计数(适用于基本数据类型,如 `int`, `float`, `long`, `BOOL`, `struct` 等)。 | 修饰符 | 适用类型 | 是否增加引用计数 | 说明 | |--------|-----------|------------------|------| | `assign` | 基本数据类型 | ❌ 否 | 只做简单赋值 | | `retain` / `strong` | 对象类型(如 `NSString *`) | ✅ 是 | 保留对象 | | `weak` | 对象类型 | ❌ 否 | 弱引用,不增加引用计数 | --- ## ✅ 举个例子: ```objective-c @property (nonatomic, assign) long familyId; ``` 等价于: ```objective-c - (long)familyId { return _familyId; } - (void)setFamilyId:(long)familyId { _familyId = familyId; } ``` 没有涉及内存管理(因为是 `long` 类型,不是对象)。 --- ## 🧠 什么时候用 `assign`? | 类型 | 推荐修饰符 | |------|-------------| | `int`, `float`, `long`, `BOOL` | `assign` | | `NSString *`, `NSArray *` 等对象类型 | `strong` 或 `weak` | | `delegate` | `weak`(防止循环引用) | --- ## ✅ 总结 | 修饰符 | 说明 | 适用类型 | |--------|------|-----------| | `nonatomic` | 非原子操作,不保证线程安全,性能好 | 所有类型 | | `assign` | 简单赋值,不涉及内存管理 | 基本数据类型(如 `long`) | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值