Lazy loaded image
📔OC中Property的属性
Words 1174Read Time 3 min
2025-1-15
2025-4-30
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方法中使用访问器方法
          • 合理使用内存管理特质,防止内存泄漏
          上一篇
          Init 一个不用Storyboard的OC项目
          下一篇
          iOS UIKit概览