文章目录
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: