大家好,
@property (nonatomic, assign) NSInteger myindex;
执行转换为Objective C ARC后,此行更改为 unsafe_unretained ,任何人都可以向我解释此事。
答案 0 :(得分:2)
_unsafe_unretained是一个变量限定符。
来自transition to ARC documentation
__ unsafe_unretained指定一个引用,它不会使引用的对象保持活动状态,并且在没有强大时不会设置为nil 对象的引用。如果它引用的对象被释放, 指针悬空。
简单地说,如果您使用此限定符,它将不会为您执行任何保留,并且当没有其他对象保留它时,它不会自动将其引用设置为nil。
首先,有问题的变量是基本类型(NSInteger
,如CGFloat
,float
等。因此,__weak
,__strong
,__unsafe_unretained
等变量限定符对它们没有影响。所以下面的代码没有危险。
@property (nonatomic, assign) NSInteger myindex;
现在,如果在某些其他部分,你有一个非原始类型,如NSString,UIImage等,使用这个限定符,那么你必须确保在整个使用期间保留变量,并在之后释放它们。
答案 1 :(得分:1)
在您的情况下,它不会更改为unsafe_unretained
,因为它是标量值。
你可能写得像:
@property (nonatomic, assign) NSInteger *myindex;
这就是它转换为unsafe_unretained
的原因。
ARC assign
实际上是unsafe_unretained
。
对于int
,float
等标量值。您可以使用assign
本身。
对于您可以使用weak
或unsafe_unretained
的对象,它取决于上下文。
unsafe_unretained
和weak
会阻止保留对象,但方式略有不同。
weak
当对象被释放时,指向对象的指针将转换为nil。unsafe_unretained
将继续指向对象所在的内存,即使它已被解除分配。这可能会因访问已释放的对象而导致崩溃。