草庐IT

objective-c - ARC - __unsafe_unretained 的含义?

coder 2023-04-25 原文

只是想确保我做对了:

  1. 我是否需要__unsafe_unretain 我不拥有的对象?
  2. 如果一个对象是 __unsafe_unretained 我需要在 @property 中使用 assign 吗?这是否意味着该对象没有被保留,而只是引用我分配给的对象?
  3. 除了代表,我还想在什么时候使用它?
  4. 这是 ARC 的东西还是以前使用过?

最佳答案

LLVM Compiler 3.0 引入了四个新的所有权限定符:__strong__autoreleasing__unsafe_unretained__weak。根据 the specification,前三个甚至在 ARC 之外也可用。 .

正如 Joshua 所指出的,默认情况下,ARC 下的所有指针都隐含为 __strong。这意味着当一个对象被分配给该指针时,只要该指针引用它,它就会被保留。这对大多数事情都很好,但它开辟了保留周期的可能性,正如我在回答 here 中所描述的那样。 .例如,如果您有一个对象包含另一个对象作为实例变量,但第二个对象作为其委托(delegate)与第一个对象有强链接,则这两个对象将永远不会被释放。

正是由于这个原因,存在 __unsafe_unretained__weak 限定符。它们最常见的用途是委托(delegate),您可以使用 weakunsafe_unretained 属性为该委托(delegate)定义一个属性(assign 实际上是 unsafe_unretained),然后通过用 __weak__unsafe_unretained 标记相应的实例变量来匹配它。这意味着委托(delegate)实例变量仍将指向第一个对象,但不会导致该对象被保留,从而打破保留循环并允许释放两个对象。

除了委托(delegate)之外,这对于打破可能在您的代码中形成的任何其他保留周期很有用。有用的是,Leaks 工具现在包含一个 Cycles View ,它以图形方式显示它在您的应用程序中发现的保留周期。

__unsafe_unretained__weak 都可以防止对象的保留,但方式略有不同。对于__weak,指向对象的指针在释放它指向的对象时会转换为nil,这是非常安全的行为。顾名思义,__unsafe_unretained 将继续指向对象所在的内存,即使在对象被释放后也是如此。由于访问该已释放对象,这可能会导致崩溃。

那你为什么要使用 __unsafe_unretained 呢?不幸的是,__weak 仅支持 iOS 5.0 和 Lion 作为部署目标。如果您想重新定位到 iOS 4.0 和 Snow Leopard,您必须使用 __unsafe_unretained 限定符,或者使用 Mike Ash 的 MAZeroingWeakRef 之类的东西。 .

关于objective-c - ARC - __unsafe_unretained 的含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592289/

有关objective-c - ARC - __unsafe_unretained 的含义?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  4. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  5. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  6. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  7. ruby object.hash - 2

    一个对象的散列值是什么意思?在什么情况下两个对象具有相同的哈希值??还有说Array|Hash不能是Hashkeys,这个跟对象的hash值有关系,为什么? 最佳答案 对于要存储在HashMap或哈希集中的对象,必须满足以下条件:如果认为两个对象相等,则它们的哈希值也必须相等。如果两个对象不被认为是相等的,那么它们的哈希值应该很可能不同(两个不同的对象具有相同哈希值的次数越多,对HashMap/集合的操作性能就越差)。因此,如果两个对象具有相同的哈希值,则很有可能(但不能保证)它们相等。上面“相等”的确切含义取决于散列方法的实现者。

  8. ruby -\b 在 Ruby 正则表达式中的真正含义是什么? - 2

    我有一个文件,其中包含诸如“CanyonSt/27thWay”之类的短语,我正试图使用​​Ruby正则表达式将其转换为“CanyonStand27thWay”。我使用file=file.gsub(/(\b)\/(\b)/,"#{$1}and#{$2}")进行匹配,但我我对\b的真正含义以及为什么$1包含斜线之前的单词边界之前的所有字符以及为什么$2包含从下一个单词开始的单词边界之后的所有字符感到有点困惑。通常,我希望正则表达式括号中的任何内容都在$1和$2中,但我不确定单词边界周围的括号真正意味着什么,因为从单词字符到字符的转换之间确实没有任何内容一个空白字符。

  9. ruby - 为什么 Object 在 Ruby 中既包含内核又继承它? - 2

    在Ruby(1.8.X)中为什么Object既继承了内核又包含了内核?仅仅继承还不够吗?irb(main):006:0>Object.ancestors=>[Object,Kernel]irb(main):005:0>Object.included_modules=>[Kernel]irb(main):011:0>Object.superclass=>nil请注意,在Ruby1.9中情况类似(但更简洁):irb(main):001:0>Object.ancestors=>[Object,Kernel,BasicObject]irb(main):002:0>Object.included

  10. ruby-on-rails - Rails 3 : Looping through array of objects, 忽略数组中的第一个对象? - 2

    在我看来,我正在尝试显示一个对象表,这是我的代码:CategoriesCBB's">然而这是抛出一个错误说:can'tconvertCapabilityBuildingBlockintoArray关系是正确的,错误来self尝试在此处减去数组的第一个对象的行:有什么方法可以忽略数组中的第一个对象来遍历数组吗?谢谢 最佳答案 尝试使用Array.drop-http://www.ruby-doc.org/core/classes/Array.html#M000294 关于ruby-on-ra

随机推荐