OC中,ARC机制下类的属性的定义

本文深入探讨了Objective-C中的属性与特质概念,解释了如何使用@property语法定义对象中的数据,并通过特质来指定存储数据所需的语义。强调了在iOS开发中,为何通常选择nonatomic特质以优化性能,同时讨论了不同内存管理语义如assign、strong、weak等的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.属性
  • 属性时OC的一项特性,用于封装对象中的数据
  • @property基于严格的命名规范
  • 优点:
    • 使用点语法和存取方法效果相同
      • 使用属性,编译器会自动编写访问这些属性所需的方法,该过程由编译器在编译器执行
  • 禁止编译器自动合成存取方法
    • 自己实现存取方法
    • 使用@dynamic关键字,该关键字会告诉编译器:
      • 不要自动创建实现属性所用的实例变量
      • 不要为其创建存取方法。编译器确定运行期一定能找到这些方法
2.属性特质(关键字)
  • 特制的设定会影响编译器所生成的存取方法
  • 特质分类
    • 原子性:默认情况下,邮编一起所合成的方法会通过锁定机制确保其原子属性
      • nonatomic:非原子的,不使用同步锁
      • atomick:原子的,使用同步锁
    • 读写权限:
      • readwrite:可读写,属性拥有getter/setter方法
      • readonly:只读,属性只由获取方法
    • 内存管理语义:所有权语义
      • assign:其设置方法只会执行针对“纯量类型”的简单赋值操作
      • strong:“拥有关系”,其设置方法先保留新值,并释放旧值,然后再将新值设置上去
      • weak:“非拥有关系”,类似于assign,但在属性所知的对象遭到销毁时,属性值也会清空(=nil)
      • unsafe_unretained:跟assign相同,但它适用于“对象类型”,对象销毁时没有赋空操作
      • copy:所属关系与strong类似,然而设置方法并不保留新值,而是将其copy。经常用此特质保护其封装性
    • 方法名:
      • getter=<name>:指定“获取方法”的方法名
      • setter=<name>:指定“设置方法”的方法名
  • 注意:所有的属性都声明为nonatomic,因为在iOS中使用同步锁的开销很大,这会带来性能问题,atomic并不能保证线程安全。


要点
  • 可以用@property语法来定义对象中所封装的数据
  • 通过“特质”来指定存储数据所需要的正确语义
  • 在设置属性所对应的实例变量时,一定要遵从该属性所声明的语义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值