ARC - __unsafe_unretained 的含义?

2024-04-25

只是想确保我做对了:

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

LLVM 编译器 3.0 引入了四个新的所有权限定符:__strong, __autoreleasing, __unsafe_unretained, and __weak。前三个甚至在 ARC 之外也可用,根据规格 http://clang.llvm.org/docs/AutomaticReferenceCounting.html.

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

正是由于这个原因,__unsafe_unretained and __weak存在限定符。它们最常见的用途是用于委托,您可以使用以下命令为该委托定义一个属性:weak or unsafe_unretained属性 (assign是有效地unsafe_unretained),然后通过标记相应的实例变量来匹配它__weak or __unsafe_unretained。这意味着委托实例变量仍将指向第一个对象,但不会导致该对象被保留,从而打破保留周期并允许释放两个对象。

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

Both __unsafe_unretained and __weak防止物体滞留,但方式略有不同。为了__weak,指向对象的指针将转换为nil释放它所指向的对象,这是非常安全的行为。顾名思义,__unsafe_unretained即使在对象被释放之后,也会继续指向对象所在的内存。这可能会因访问该已释放的对象而导致崩溃。

你为什么会使用__unsafe_unretained然后?很遗憾,__weak仅支持 iOS 5.0 和 Lion 作为部署目标。如果你想回到 iOS 4.0 和 Snow Leopard,你必须使用__unsafe_unretained限定符,或者使用类似 Mike Ash 的东西MAZeroing弱引用 http://www.mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARC - __unsafe_unretained 的含义? 的相关文章

  • GCD获取队列名称/标签

    如何获取当前队列名称 我的意思是队列标签com example myqueue 在 Xcode 4 调试器中我只能看到 block invoke 1 怎么样dispatch queue get label http developer ap
  • Swift 2 中的 segue 没有后退按钮

    我刚刚将我的项目移植到 Swift 2 一切都运行良好 除了即使是最简单的 segues 也没有后退按钮 这是我正在使用的 segue 函数的准备 override func prepareForSegue segue UIStoryboa
  • 如何将LUT png用于CIColorCube滤镜?

    我想使用查找表 png example http nghiatran me wp content uploads 2014 06 FilterMe Part2 ProcessedLUT png 作为颜色立方体数据CIColorCubeSwi
  • 了解 Mac 上的 Oracle Java

    我在 OS X 上使用 Java 很多很多年了 最近当 Apple 停止默认包含 Java 时 我放弃了操作系统并为我安装了它 当然是 Apple 的版本 现在我使用的是 OS X 10 8 并且需要安装 Java 7 因此我刚刚获得了 D
  • 自定义 UITableViewRowAnimation 或持续时间

    我有一个用户可以拖动的应用程序UITableViewCells从一TableView到另一个 我通过在用户触摸的 UITableViewCell 顶部渲染一个 虚拟 单元格来实现此目的 并禁用 真实 单元格 然后我在目标中插入一个新行UIT
  • 当我的 iPAD 上安装了应用程序的“.ipa”文件时,如何获取 IOS 应用程序的捆绑包 ID

    我正在尝试在安装了我的应用程序的 iPad 上进行自动化测试 我正在使用 Appium 来自动化应用程序 它要求我输入需要测试的应用程序的捆绑 ID 有人可以帮我找到一种方法 从我的 IPAD 上安装的应用程序或从我的 iMAC 上下载的
  • Mapbox-iOS-SDK 6.3.0 Pod 安装错误 403 Forbidden

    下载Mapbox示例 运行pod install 报错 403 Forbidden 为什么 请帮忙 谢谢 pod Mapbox iOS SDK gt 6 3 0 ios sdk examples 298e050be7352eb28cee6f
  • iOS CorePlot如何安装

    我正在尝试在我的一个 iOS 项目中使用 CorePlot 但即使按照说明并在网上查找后 我仍无法正确安装该框架 我觉得文档没有发展 不再描述安装框架的正确方法 我跟着这些说明 https code google com p core pl
  • 如何按日期正确对从 CoreData 获取的列表进行分组?

    为了简单起见 假设我想创建一个简单的待办事项应用程序 我的 xcdatamodeld 中有一个实体 Todo 其属性id title and date 以及以下 swiftui 视图 如图所示的示例 import SwiftUI struc
  • 如何从 os_log() 查找源文件和行号

    The 记录 Apple 参考 https developer apple com reference os 1891852 logging对于 iOS 10 和 macOS Sierra 中的新日志记录系统 明确表示不要包含行号和源文件信
  • 以编程方式添加 TabBarController

    我想以编程方式制作标签栏控制器和导航控制器 到目前为止 我的代码有效 它在底部显示了一个选项卡栏 但 OptionViewController 在第二个选项卡栏的按钮上没有说任何内容 没有标题 有趣的是 当我单击没有任何内容的按钮时 标题出
  • ios safari - getUserMedia 无法正常工作

    我真的有this https stackoverflow com q 45692526 6048715问题 但 OP 的解决方案对我不起作用 重申一下 我正在使用navigator mediaDevices getUserMedia 在浏览
  • Alamofire 使用公共键和多个值传递参数?

    我需要在我的项目中执行此操作 如果我手动将字符串附加到 Alamofire 中的 URL 我可以轻松完成此操作 但我不希望这样做 我想要的参数为范围 object 参数的一个公共键中有多个值 我一直在做什么 public func find
  • sqlite 3“SQL 错误‘内存不足’(7)”objc

    嗨 有人可以指出我做错了什么吗 错误是这样的 SQL error out of memory 7 NSArray RecipeInfo NSMutableArray retval NSMutableArray alloc init NSSt
  • 如何在 SwiftUI 中管理 AVPlayer 状态

    我有 SwiftUI 中的 URL 列表 当我点击某个项目时 我会呈现一个全屏视频播放器 我有一个 EnvironmentObject它处理一些查看器选项 例如 是否显示时间码 我还有一个显示和隐藏时间码的切换开关 我只在本例中包含了该切换
  • 在 Objective-C 中从异步块增加变量

    我在 Objective C 中开发的服务遇到了一些难题 该服务的目的是解析核心数据实体列表并为每个对象下载相应的图像文件 该服务的原始设计因太多同时下载请求而阻塞了我的网络服务器 为了解决这个问题 我将负责执行下载请求的代码移至递归方法中
  • 长按 UIButton

    我想知道如果有人按住 UIButton 按键的时间过长 我是否可以捕获 UIButton 的事件 通过通知或其他机制 比按一次按钮的时间更长 假设有人按住按钮几秒钟 谢谢 你可以加UILongPressGestureRecognizer h
  • 在 WatchKit 和主机 App 中使用具有不同标志的同一文件

    我试图在我的 watchkit 扩展和主机应用程序中使用相同的代码 但在主机应用程序中使用一些附加代码 在 watchkit 扩展中使用一些附加代码 为此 我在各自的目标上添加了 WATCH 和 APP swift 标志 问题是 当我在选择
  • UIImageView 没有调用drawRect

    我的 IB 中有一个 UIImageView 我用一个方法 drawRect 创建了 UIImageView 的子类 implementation UIImageViewLine void drawRect CGRect rect NSLo
  • 由于某种原因,AdColony 的 AdReward 无法在 Swift 2.0 上运行

    我想在我的游戏中实现奖励插页式广告 但我收到了很多 AdColony 错误 例如 未填写广告请求 或我的区域 ID 无效 首先 这就是我配置 AdColony 区域的方式 Zone is active Yes Zone Type Prero

随机推荐