将类转换为非弧的弧

时间:2012-12-03 04:08:42

标签: iphone ios

大家好,

@property (nonatomic, assign) NSInteger myindex;

执行转换为Objective C ARC后,此行更改为 unsafe_unretained ,任何人都可以向我解释此事。

2 个答案:

答案 0 :(得分:2)

_unsafe_unretained是一个变量限定符。

来自transition to ARC documentation

  

__ unsafe_unretained指定一个引用,它不会使引用的对象保持活动状态,并且在没有强大时不会设置为nil   对象的引用。如果它引用的对象被释放,   指针悬空。

简单地说,如果您使用此限定符,它将不会为您执行任何保留,并且当没有其他对象保留它时,它不会自动将其引用设置为nil。

编辑:看到评论后

首先,有问题的变量是基本类型(NSInteger,如CGFloatfloat等。因此,__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

对于intfloat等标量值。您可以使用assign本身。 对于您可以使用weakunsafe_unretained的对象,它取决于上下文。

unsafe_unretainedweak会阻止保留对象,但方式略有不同。

  • weak当对象被释放时,指向对象的指针将转换为nil。
  • unsafe_unretained将继续指向对象所在的内存,即使它已被解除分配。这可能会因访问已释放的对象而导致崩溃。