大家好,
@property (nonatomic, assign) NSInteger myindex;
在执行到 Objective C ARC 的转换后,此行更改为unsafe_unretained任何人都可以解释一下。
_unsafe_unretained 是一个变量限定符。
__unsafe_unretained 指定一个不保持被引用对象活动的引用,并且在没有对该对象的强引用时不设置为 nil。如果它引用的对象被释放,则指针悬空。
简单地说,如果你使用这个限定符,它不会为你做任何保留,并且当没有其他对象保留它时,它不会自动将其引用设置为 nil。
首先,所讨论的变量是原始类型(NSInteger
、 likeCGFloat
等float
)。__weak
所以像, __strong
,之类的变量限定符__unsafe_unretained
对它们没有影响。所以下面的代码没有危险。
@property (nonatomic, assign) NSInteger myindex;
现在,如果在其他一些部分,您有一个非原始类型,如 NSString、UIImage 等,带有此限定符,那么您必须确保在整个使用过程中保留变量,并在之后释放它们。
在您的情况下,它不会更改为,unsafe_unretained
因为它是一个标量值。可能你这样写:
@property (nonatomic, assign) NSInteger *myindex;
这就是它转换为unsafe_unretained
.
在 ARCassign
中是有效的unsafe_unretained
。
对于标量值,如int
, float
。你可以assign
自己使用。对于可以使用weak
或的对象unsafe_unretained
,这取决于上下文。
unsafe_unretained
并weak
防止保留对象,但方式略有不同。
weak
当对象被释放时,指向对象的指针将转换为 nil。unsafe_unretained
将继续指向对象所在的内存,即使在对象被释放后也是如此。由于访问该解除分配的对象,这可能会导致崩溃。