swift 如何处理内存中的 nil 值

2024-03-16

我知道 ARC 使用引用计数,并在设置(强)引用时使用编译器插入的递增和递减操作。当对象的最后一个引用组超出范围后,它会清除内存。

我的问题包含有关 var 的问题:

var key = NSData?

如果不存在值,则默认为零。现在,在我分配它并将值重新分配为 nil 之后 -key = NSData()。这会从内存中删除以前存在的数据吗?

任何有用的文章将不胜感激。


当你写的时候

var key = NSData?

The key变量被创建到堆栈中并且nil值被分配给它。

假设接下来你将一个对象分配给 key 所以

key = NSData()

现在是一个类型的对象NSData被创建到堆中。并且该对象的地址被写入key变量(进入堆栈)。 ARC 还注意到,现在refereneCountNSData 对象的值为 1,因为它被 1 个变量引用。

现在我们再次分配nil to key

key = nil

然后 ARC 检测到NSData不再引用存在于堆中的内容。 所以就是referenceCount下降到 0 并且 ARC 将其从内存中删除(或者可能将该堆区域标记为可以再次使用的空闲内存)。

对象到底什么时候被释放?

As @亚伦布拉格指出,该对象不会立即从内存中释放。当自动释放池耗尽时,它实际上被释放。

下面的例子确实表明了这一点

正如你所看到的"end"打印确实发生了before the Person对象被释放。

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

swift 如何处理内存中的 nil 值 的相关文章

  • iOS 以编程方式撤销位置服务权限

    有没有一个功能CLLocationManager or UIApplication撤销位置权限类似功能unregisterForRemoteNotifications撤销推送通知权限 The stopUpdatingLocationCLLo
  • 如何在iOS应用程序中实现信号量?

    是否可以在ios应用程序中实现计数信号量 对的 这是可能的 有很多可用的同步工具 同步 NSLock NS条件 NS条件锁 GCD 信号量 并行线程锁 我建议阅读 线程编程指南 http developer apple com librar
  • 如何在 Swift 中编写 Cordova 插件?

    我将现有的自定义插件转换为 Swift 语言 位于Plugins CustomPluginInSwift swift import Foundation class CustomPluginInSwift CDVPlugin func ge
  • 如何在iOS社交框架中使用SLRequest获取facebook的电子邮件参数

    我尝试使用以下代码来获取登录 iOS 设置 Facebook 的人的电子邮件 请帮助我如何从 SLRequest 获取电子邮件 void getMyDetails if accountStore accountStore ACAccount
  • 为什么我的 Cordova/PhoneGap iOS 应用程序在设备旋转时不旋转?

    我正在尝试做一个仅横向应用程序 https stackoverflow com questions 10996676 phonegap page has wrong rotation shows as portrait in landsca
  • 我如何知道我的 iOS 应用程序的蜂窝网络访问是否被禁用?

    我有一个 iOS 应用程序 它在应用程序启动时发出一些小型网络请求 资源更新等 如果用户在 iOS 设置中关闭应用程序的蜂窝网络访问 他们每次启动时都会收到 iOS 的有关网络使用情况的提示 有没有办法以编程方式知道此应用程序的蜂窝数据已被
  • 如何在 tvOS 中添加检测按钮按下情况?

    我已经遵循这个tutorial http jamesonquave com blog developing tvos apps for apple tv with swift 一切正常 我遇到的唯一问题是我不知道如何检测何时按下按钮 提前致
  • 使用 QuartzCore 为 UITextView 创建阴影 [重复]

    这个问题在这里已经有答案了 我使用创建了一个阴影QuartzCore for my UITextView使用以下代码 myTextView layer masksToBounds NO myTextView layer shadowColo
  • 数组排序错误:“二元运算符 '<' 无法应用于两个 'Int?'操作数”

    这是按 tableView 时间戳中的每个单元格对数组进行排序的代码 self ProjectsArray sorted by project project2 gt Bool in return project timestamp int
  • 在 SwiftUI App 中实现深色模式切换

    我目前正在我的应用程序中研究深色模式 虽然由于我的 SwiftUI 基础 深色模式本身并不困难 但我正在努力选择将 ColorScheme 设置为独立于系统 ColorScheme 的选项 我在苹果人机界面指南中找到了这一点 https i
  • 将 NSData 视频文件合并为一个视频文件

    我有一堆视频文件想要合并成一个视频文件 我正在使用 NSMutableData 来完成该任务 NSMutableData concatenatedData NSMutableData alloc init for int i 0 i lt
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • SwiftUI ScrollView 只向一个方向滚动

    尝试使用视图作为列表行样式来创建自定义列表 以摆脱默认情况下列表中难看的分隔线 但是 一旦我将 ZStack 行放入滚动视图中 滚动视图就会在两个方向上滚动 而不仅仅是垂直滚动 这是内容视图 NavigationView ScrollVie
  • 迁移大型 Core Data 数据库崩溃

    我有一个将产品存储在核心数据文件中的应用程序 这些产品包括作为 可转换 数据的图像 现在我尝试使用轻量级迁移添加一些属性 当我使用一个小型数据库对其进行测试时 它运行良好 但当我使用一个接近 500 MB 的大型数据库时 应用程序通常会因内
  • 如何在WKInterfaceLabel下面放置一个WKInterfaceLabel?

    大家好 我在 watchkit 开发中有新的东西 我有特殊要求 我将一个 WKInterfaceLabel 安排在另一个 WKInterfaceLabel 下面 我尝试使用很多关闭选项 例如编辑位置 但 WKInterfaceLabel 未
  • MPMoviePlayerController 播放 YouTube 视频

    如何在 iPhone 上的 MPMoviePlayerController 中播放 YouTube 视频 同时避免进入全屏模式 这个问题已经在这里提出 MPMoviePlayerController 正在播放 YouTube 视频吗 htt
  • 协议本身不符合?

    为什么这段 Swift 代码无法编译 protocol P struct S P let arr P S extension Array where Element P func test
  • 如何区分iphone4和iphone 3

    我正在尝试使用 cocos2d 引擎为 iphone 构建游戏 我想知道如何区分用户使用的是 iphone 4 还是 iphone 3 因为我想为 iphone4 加载高分辨率图形 为 iphone 3 加载低分辨率图形 我知道我是否在以下
  • iOS Swift 中断键盘事件

    我在拦截键盘事件时遇到问题 我已将我的 iOS 与 SteelSeries Free 游戏手柄控制器 连接 当连接到 iOS 时 它将被检测为蓝牙键盘 这是在我打开Notes时测试的 按下游戏手柄上的任何按钮都会写一个字母 我需要拦截此按钮
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是

随机推荐

  • 带 onClick 的按钮在 React 中只能工作一次

    我需要在 React 应用程序中制作折叠菜单 但带有 onClick 的按钮只能工作一次 我创建了一个布尔变量 当我点击按钮时它应该会改变 但我只能点击按钮一次 此后 a 不起作用 它处于非活动状态 let isOpened false c
  • 将指针容器转换为智能指针?

    有没有一种简洁 通用的方法来转换std容器 例如vector 常规 哑指针 vector lt T gt 例如 boost shared ptr vector lt boost shared ptr
  • 清除向量或定义新向量,哪个更快

    哪种方法更快并且开销更少 方法一 void foo std vector lt int gt aVector for int i 0 i lt 1000000 i aVector clear aVector push back i 方法二
  • 使用iOS SDK在运行时创建plist?

    我是 iPhone 开发新手 我想知道是否有任何示例 Objective C 代码可以通过从网络服务器获取数据来在运行时创建 plist 并且我想知道数据的格式应该是什么 以便我可以在运行时轻松创建 plist 非常简单NS词典 http
  • 如何在 python 中使用 numba.jit 将计算值传递到列表排序?

    我正在尝试使用 Python 中的 numba jit 函数中的自定义键对列表进行排序 简单的自定义键可以工作 例如我知道我可以使用如下所示的绝对值进行排序 import numba numba jit nopython True def
  • 查找 Elixir/Erlang 内存文件的长度?

    在 Elixir 或 Erlang 中 如果我有一个内存文件 如何找到它的字节长度 ok fd file open ram read write file write fd hello 不确定是否有更好的方法 但这就是我所做的 def ge
  • 如何迭代命令行上传递的所有文件行?

    我通常在 Perl 中这样做 随便 pl while lt gt do whatever then cat foo txt whatever pl 现在 我想用 Python 来做这件事 我试过sys stdin但我不知道如何像我在 Per
  • iOS - Path 等应用程序如何优化每个单元格(几乎)不同的表格单元格?

    这就是我目前遇到的问题 我有一个应用程序 可以使用 UITableView 显示类似 Facebook Path 的提要 假设我的数据源有大约 200 个项目 并且并非所有单元格都具有相同的内容和单元格高度 有些有图像 有些没有 通过使用以
  • 如何获取交易结果和状态

    我正在尝试使用以太坊区块链和 Solidity 合约 我目前正在部署合约并对其执行一些操作 但我想知道如何获取特定交易的一些 反馈 回调 返回 例如 有没有办法将事务的状态设置为 0 错误 并仍然获取事件 if id length lt 0
  • 从 C# 中的文本文件中读取特定行数

    我正在使用以下 StreamReader 来读取文本文件 string temp fs ReadToEnd readlines i temp 我想从文本文件中读取特定行数 比如说 仅从第 1 行到第 300 行 然后将这些行写入数组的一个元
  • Twitter Bootstrap 适合触摸屏吗?

    我正在考虑将 Twitter Bootstrap TB 用于移动网络应用程序 TB的下一个版本 版本3 https github com twitter bootstrap tree 3 0 0 wip js 号称 移动优先 然而 查看包含
  • IDE 对 Dispatchers.IO 协程中的阻塞调用发出警告

    我正在开发一个简单的应用程序 需要来自 URL 调用的数据 这是相关的代码部分 class NewsFeed AppCompatActivity override fun onCreate savedInstanceState Bundle
  • 当前在网络浏览器中流式传输实时视频的最佳实践?

    我们开发了一款 IP 摄像机产品 可通过 RTSP UDP 传输 H 264 MPEG4 MJPEG 视频 它有一个 Web 界面 目前我们使用 VLC Firefox 插件来允许在浏览器中查看实时 RTSP 流 但 Firefox 正在放
  • 使用 C# 更改 Windows 服务凭据的最佳方法是什么

    我需要使用 C 更改现有 Windows 服务的凭据 我知道有两种不同的方法可以做到这一点 更改ServiceConfig 参见pinvoke net 上的 ChangeServiceConfig http www pinvoke net
  • 从 MS Access 中的字符串提取/转换日期

    我正在尝试使用以下模式从字符串中提取日期 时间 并将它们转换为 Access 中的日期类型 2012 年 4 月 8 日 21 26 49 由 SMITH MD JOHN 123 于 2012 年 4 月 2 日上午 11 11 01 确认
  • 重载运算符==抱怨“必须只接受一个参数”

    我正在尝试超载operator 但编译器抛出以下错误 bool Rationalnumber operator Rationalnumber Rationalnumber must take exactly one argument 我的一
  • 使用内存证书进行客户端身份验证

    我的 Windows 盒子里有一个不可导出的证书 当我尝试访问网站时 它可以在 IE 和 Chrome 上正常工作 我希望能够使用 Go CLI 应用程序中的此证书来访问需要客户端证书身份验证的 HTTPS URI 但也需要一个非标准 CA
  • app.set 函数有什么作用(express.js)?

    我是 node js 的新手 正在查看一个无法理解的示例 app set title My Site 请问有帮助吗 您可以使用 Express 实例来存储和检索变量 在这种情况下 您可以将标题设置为 我的网站 并稍后使用类似的内容检索它 v
  • 规范化空间(.)和规范化空间(文本())有什么区别?

    我正在编写一个 XPath 表达式 并且修复了一个奇怪的错误 但是以下两个 XPath 表达式有什么区别 td starts with normalize space Posted Date and td starts with norma
  • swift 如何处理内存中的 nil 值

    我知道 ARC 使用引用计数 并在设置 强 引用时使用编译器插入的递增和递减操作 当对象的最后一个引用组超出范围后 它会清除内存 我的问题包含有关 var 的问题 var key NSData 如果不存在值 则默认为零 现在 在我分配它并将