一、void *
void指针使用规范
①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。
二、__bridge
三、unsafe_unretained
如果定义了ARC有效,那么必须要有所有者属性的定义;所以我们的代码改成这样,就OK了
(nonatomic, strong, readonly) NSString *name;
void的含义
void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范
①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。
二、__bridge
id 型或对象型变量赋值给void * 或者逆向赋值时都需要进行特定的转换。如果只想单纯地赋值,则可以使用“_ _ bridge 转换”。
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (__bridge id)p;
像这样,通过“_ _ bridge 转换”,id 和void * 就能够相互转换。
但是转换为void * 的_ _ bridge 转换,其安全性与赋值给_ _ unsafe_unretained 修饰符相近,甚至会更低。如果管理时不注意赋值对象的所有者,就会因悬垂指针而导致程序崩溃。
_ _ bridge 转换中还有另外两种转换,分别是“_ _ bridge_retained 转换”和 “_ _ bridge_transfer转换”
id obj = [[NSObject alloc] init];
void *p = (__bridge_retained void *)obj;
三、unsafe_unretained
读写相关的属性有 readwrite 和 readonly 两种,如果使用ARC之后,我么需要注意一下 readonly 属性的使用。
比如下面的变量声明。
- @property
(nonatomic, readonly) NSString *name;
一般声明为 readonly 的变量按理说应该不需要持有所有权了,但是在ARC有效的情况下,将出现下面的错误信息 :
|