繁体   English   中英

将类从非弧转换为弧

[英]convertion of a class to arc from non-arc

大家好,

@property (nonatomic, assign) NSInteger myindex;

执行转换为目标 C ARC 后,此行更改为unsafe_unretained任何人都可以对此进行解释。

_unsafe_unretained 是一个变量限定符。

过渡到 ARC 文档

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

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

编辑:看到评论后

首先,有问题的变量是原始类型( NSInteger ,如CGFloatfloat等)。 所以像__weak__strong__unsafe_unretained这样的变量限定符对它们没有影响。 所以下面的代码没有危险。

@property (nonatomic, assign) NSInteger myindex;

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

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

@property (nonatomic, assign) NSInteger *myindex; 

这就是它转换为unsafe_unretained的原因。

在 ARC 中assign实际上是unsafe_unretained

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

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

  • weak指针的对象当对象被释放,将转换到零。
  • unsafe_unretained将继续指向对象所在的内存,即使在它被释放之后也是如此。 由于访问该释放的对象,这可能导致崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM