3

大家好,

@property (nonatomic, assign) NSInteger myindex;

在执行到 Objective C ARC 的转换后,此行更改为unsafe_unretained任何人都可以解释一下。

4

2 回答 2

2

_unsafe_unretained 是一个变量限定符。

过渡到 ARC 文档

__unsafe_unretained 指定一个不保持被引用对象活动的引用,并且在没有对该对象的强引用时不设置为 nil。如果它引用的对象被释放,则指针悬空。

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

编辑:看到评论后

首先,所讨论的变量是原始类型(NSInteger、 likeCGFloatfloat)。__weak所以像, __strong,之类的变量限定符__unsafe_unretained对它们没有影响。所以下面的代码没有危险。

@property (nonatomic, assign) NSInteger myindex;

现在,如果在其他一些部分,您有一个非原始类型,如 NSString、UIImage 等,带有此限定符,那么您必须确保在整个使用过程中保留变量,并在之后释放它们。

于 2012-12-03T04:13:55.630 回答
1

在您的情况下,它不会更改为,unsafe_unretained因为它是一个标量值。可能你这样写:

@property (nonatomic, assign) NSInteger *myindex; 

这就是它转换为unsafe_unretained.

在 ARCassign中是有效的unsafe_unretained

对于标量值,如int, float。你可以assign自己使用。对于可以使用weak或的对象unsafe_unretained,这取决于上下文。

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

  • weak当对象被释放时,指向对象的指针将转换为 nil。
  • unsafe_unretained将继续指向对象所在的内存,即使在对象被释放后也是如此。由于访问该解除分配的对象,这可能会导致崩溃。
于 2012-12-03T04:16:58.080 回答