在ARC下, 如果我定义这样的ivar:
@interface ObjectA : NSObject {
id A;
}
@property(nonatomic,unsafe_unretained) id A;
A的属性是什么?强或不安全的?
答案 0 :(得分:2)
这取决于你如何实现它。你有两种方法可以做到这一点:
@synthesize A;
或@synthesize A = __A;
在这种情况下,它是__unsafe_unretained
,因为该属性的所有权规范胜过了ivar 1 的所有权规范。A
和setA
。在这种情况下,结果将取决于您为实现选择的支持变量的类型。 2 以下是文档的link,其中详细说明了如何确定属性所有权的规则。见4.1.1节。
1 如果关联的实例变量已存在,则其所有权限定必须等于该属性的所有权;否则,实例变量是使用[属性]的所有权限定创建的。
2 属性的指定所有权保留在其元数据中,但除非属性是合成的,否则其含义纯属常规。
答案 1 :(得分:0)
来自apple doc:
可变限定符
对变量使用以下生命周期限定符,就像使用const。
一样__strong
__weak
__unsafe_unretained
__autoreleasing
__strong
是默认值。只要存在指向它的强指针,对象就会保持“活着”。
__weak
指定不使引用对象保持活动状态的引用。当没有对象的强引用时,弱引用设置为nil。
__unsafe_unretained
指定一个引用,它不会使引用的对象保持活动状态,并且在没有对该对象的强引用时不会设置为nil。如果它引用的对象被释放,则指针悬空。
__autoreleasing
用于表示通过引用(id *)传递的参数,并在返回时自动释放。
你应该正确装饰变量。在对象变量声明中使用限定符时,正确的格式为: