ObjC 基础-属性关键字(atomic、nonatomic、retain、strong、copy、assign、unsafe_unretained、weak)的区别与用法

本文详细介绍了Objective-C中属性关键字的使用,包括原子性操作(atomic、nonatomic)、内存管理(retain、strong、copy、assign、unsafe_unretained、weak)以及读写权限(readOnly、readWrite)。重点讨论了nonatomic在多线程环境下的性能优势,以及为何在特定情况下使用copy修饰Block和NSString属性。此外,还解释了weak关键字防止循环引用的作用及其底层实现原理。
摘要由CSDN通过智能技术生成

ObjC 基础 关键字-属性关键字

属性的功能:

  • 编译器会自动生成setter和getter方法的声明与实现。
  • 如果没有声明成员变量,自动声明一个_属性名的私有变量(默认的成员变量是受保护的)。

属性关键字大体分为几大类:

  • 原子操作类:atomic、nonatomic。默认是atomic,保证线程安全。
  • 内存管理类:retain、strong、copy、assign、unsafe_unretained、weak。默认是assign。
  • 读写权限类:readwrite、readonly。默认是readwrite,可读可写。
  • iOS9新增关键字:nonnull、nullable、null_resettable、null_unspecified

原子操作类

atomic

表示原子性(默认属性),用于保证属性的setter和getter方法内部都是原子性操作,相当于在setter和getter方法内部加了线程同步的锁。

  • atomic并不能保证使用属性的过程是线程安全的;
  • 属性的调用频率非常高,如果使用atomic,那太耗性能,而iOS设备的内存本来就小,在iOS开发中几乎不会使用,在mac开发中才可能会使用。
  • atom:原子,代表不可再分割的单位;
  • 底层源码实现 (objc-accessors.mm
// setter
static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy)
{
    if (!atomic) {
        oldValue = *slot;
        *slot = newValue;
    } else {
        spinlock_t& slotlock = PropertyLocks[slot];
        slotlock.lock();
        oldValue = *slot;
        *slot = newValue;        
        slotlock.unlock();
    }
    objc_release(oldValue);
}

// getter
id objc_getProperty_non_gc(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {

    // Retain release world
    id *slot = (id*) ((char*)self + offset);
    if (!atomic) return *slot;
        
    // Atomic retain release world
    spinlock_t& slotlock = PropertyLocks[slot];
    slotlock.lock();
    id value = objc_retain(*slot);
    slotlock.unlock();
    
    return objc_autoreleaseReturnValue(value);
}

nonatomic

表示非原子性,属性的setter和getter方法是非线程安全的,开发中经常使用。

内存管理类

想要持有某个对象,就让它的引用计数+1,进行retain操作,不想再持有某个对象,就让它的引用计数-1,进行release操作。

retain

诞生于MRC,表示持有该对象,会进行retain操作,会对该对象的引用计数加1

  • 只适用于指针类型,一般用于修饰对象类型(继承自NSObject的类)或id类型。
  • ARC环境下 ,strong取代了retain。
  • 底层实现伪代码:
- (void)setCar:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值