ARC - The meaning of __unsafe_un

作者: ac41d8480d04 | 来源:发表于2016-08-01 22:49 被阅读1058次

前几天查阅别人代码,看到了__unsafe_unretained修饰符,因为很少遇见,所以立即Google,发现StackOverFlow里有一个很不错的解释,所以翻译过来给大家一起看看。

点击进入StackOverFlow问答页

一、问题

问题
问题翻译

仅仅是为了确认我理解的对:
1、我需要用__unsafe_unretained来修饰不属于我的参数么?
2、如果一个参数是被__unsafe_unretained修饰,我需要在@property里面用assign修饰么?那是否意味着这个对象不被保留,只是引用了我指定的对象?
3、除了代理之外,我什么时候需要用到它?
4、它是一个ARC的东西,还是我要在它之前用?

二、回答

回答

回答翻译

LLVM 3.0编译器提供了四中私有的标示符:__strong__autoreleasing__unsafe_unretained__weak。前三个甚至在ARC之外也是有用的,正如说明书中所说

正如Joshua所说的,默认在ARC情况下所有的指针都指向__strong。这意味着当一个对象分配给了那个指针,只要指向它,它就是被持有的。这样大部分情况下都是没问题的,正如我回答的这个问题,这样有一定可能性会导致循环引用。比如,如果有一个包含了其他对象作为实例变量的对象,但第二对象作为第一个对象的代理具有强关联,这两个对象将永远不会被释放。

就是因为这个原因导致__unsafe_unretained__weak的存在。他们最通常是用在代理上,在这里你会为那个代理定义一个有weak或者unsafe_unretained参数的属性(assignunsafe_unretained一样的作用),然后通过weak或者__unsafe_unretained标记相应的实例变量来匹配。这就意味着那个代理实例变量仍然指向第一个对象,但是它不会导致那个参数被持有,从而打破循环引用并允许两个参数被释放。

除了代理之外,这个也对打破在你的代码里形成的任何循环引用都有用处。有帮助的是,Leaks instrument现在包括一个Cycles界面,它会用图形的方法展示在你的应用里发现的循环引用。

但是在细微不同的方式下,__unsafe_unretained__weak都防止了参数的持有。对于__weak,指针的对象在它指向的对象释放的时候回转换为nil,这是一种特别安全的行为。就像他的名字表达那样,__unsafe_unretained会继续指向对象存在的那个内存,即使是在它已经销毁之后。这会导致因为访问那个已释放对象引起的崩溃。

那么为什么你还要使用__unsafe_unretained?不幸的是,__weak只支持iOS 5.0OS X Mountain Lion作为部署版本。如果你想部署回iOS 4.0OS X Snow Leopark,你就不得不用__unsafe_unretained标识符,或者用一些其他东西,就像Mike AshMAZeroingWeakRef

本篇翻译是我第一次翻译英文技术问答,翻译中一定会出现翻译不得当的地方,欢迎各位同行朋友予以指正交流,收到反馈之后,我一定第一时间改正错误。

另外

相关文章

  • ARC - The meaning of __unsafe_un

    前几天查阅别人代码,看到了__unsafe_unretained修饰符,因为很少遇见,所以立即Google,发现S...

  • 序言(来者之路)-3

    The supreme meaning is not a meaning and not an absurdity...

  • 2017-12-29

    The meaning of life is to give life a meaning It is not a...

  • The meaning of life

    The meaning of life is to give life a meaning.

  • Meaning

    To universe, there’s no meaning, but just being. Meaning ...

  • meaning

    ————仅为生存,却很少有人考虑过生存的意义 当生命的源头 归为一滩死水 华贵的金银 只会沉入其中 深不见底 做一...

  • meaning

    你总想让我生活的有意义,其实现在的我,只想生活的有意思。 宇宙的丛林法则,人类不过是试验品,跳梁小丑。总会回归尘土。

  • The meaning

    生活中得不到的东西 统统在文字世界里实现吧

  • 03语用意义

    Chapter 3Pragmatic Meaning 2017.9.20 Semantic meaning and...

  • How do you make a banana milk sh

    Do you know the meaning of"DIY"? Its meaning is"Do it you...

网友评论

  • Dravenn:如果你想部署回iOS 4.0和OS X Snow Leopark,你就不得不用__unsafe_unretained标识符,,,但是MJRefresh还有用这个关键字啊,这是为什么呢
    需要药:@ameerkat 用__unsage_unretained容易出现野指针吧?
    ameerkat:除了兼容,__unsafe_unretained还有一个使用原因:weak对性能有一定影响,一个对象有大量weak引用对象的时候,当对象被废弃,要给所有weak引用过它的对象赋nil,消耗CPU资源。但是__unsafe_unretained在这方面没有影响。

本文标题:ARC - The meaning of __unsafe_un

本文链接:https://www.haomeiwen.com/subject/rpqfsttx.html