iOS Objective-C 对象:何时使用release,何时不使用它

2024-05-06

我在 iOS 下,正在使用 delphi Tokyo 进行开发,这是我的代码:

      aUIImage := TUIImage.Wrap(TUIImage.alloc.initWithCGImage(aCGImageRef));
      try

        aData := TNSData.Wrap(UIImageJPEGRepresentation((aUIImage as ILocalObject).GetObjectID, cWin_DefaultJPGCompressionRate / 100));
        try
          aWorkPicStream.WriteBuffer(aData.bytes^, aData.length);
        finally
          aData.release; // << this make my code will crash (later not now)
        end;

      finally
        aUIImage.release;
      end;

执行代码后,稍后在执行中出现此错误:

myproj  [E][W][I][D][V] Error => Access violation at address 0000000184D4891C, accessing address 0000000107FD286C
At address: $0000000184D4891C (objc_msgSend + 28)

Call stack:
myproj                    $0000000103E00548 Grijjy.Errorreporting.TgoExceptionReporter.GlobalGetExceptionStackInfo(TExceptionRecord*) + 196
myproj                    $00000001030DF0EC Sysutils.Exception.RaisingException(TExceptionRecord*) + 88
myproj                    $0000000103116164 Sysutils.RaiseExceptObject(TExceptionRecord*) + 84
myproj                    $00000001030BB498 _RaiseAtExcept(TObject*, Pointer) + 128
myproj                    $00000001030DD900 Internal.Excutils.SignalConverter(NativeUInt, NativeUInt, NativeUInt) + 68
libobjc.A.dylib           $0000000184D5213C <redacted> + 844
CoreFoundation            $0000000185A40AAC _CFAutoreleasePoolPop + 28
Foundation                $00000001864FB960 <redacted> + 148
myproj                    $00000001031B426C Classes.ThreadProc(Classes.TThread*) + 948
myproj                    $00000

如果我评论该行aData.release;那么我就不会遇到任何错误。

为什么 ?如何知道什么时候必须调用release,什么时候不能调用release?


iOS 的 ARC 规则相当简单,如下所示Apple 的基本内存管理规则 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html.

名称开头为的方法alloc, new, copy, or mutableCopy不需要致电retain。相反,如果你调用它,就会造成内存泄漏,因为会有一个retain太多。但他们确实需要release or autorelease。这些对象实例是您创建的,在 Objective-C 下,它们在构造时会自动保留。

aUIImage是使用构造的alloc,你拥有它并且你有责任释放它release。另一方面你并不拥有aData并将由系统处理。

另一件要记住的事情是,对于您不拥有的对象,您可能需要同时调用retain and release只要您正在使用它,就可以使对象实例保持活动状态。由于接收到的对象通常保证在接收它的方法中保持有效,因此您不必调用retain and release upon aData在你的代码中。


The retainCount方法返回 Objective-C 对象实例的当前引用计数。这个数字纯粹是提供信息,在 iOS 或 macOS 下没有调试价值,但它足以显示 Objective-C 和 Delphi 内存管理之间的交互,并且有时会有所帮助。

来自苹果文档关于保留计数 https://developer.apple.com/documentation/objectivec/1418956-nsobject/1571952-retaincount?language=objc:

retainCount - 不要使用此方法

此方法对于调试内存管理问题没有任何价值。 因为任意数量的框架对象都可能保留了一个对象 为了保存对它的引用,同时自动释放 池可以在对象上保存任意数量的延迟释放,它 您不太可能从该方法中获得有用的信息。

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

iOS Objective-C 对象:何时使用release,何时不使用它 的相关文章

  • Xcode 中的 iOS 9 警告 - 此文件设置为针对早于项目部署的版本进行构建。功能可能有限

    我刚刚将我的 Mac 更新到最新的操作系统 并将 Xcode 更新到最新版本 现在我收到此警告 但我不知道该由谁来删除它 也不知道它的真正含义是什么 有人可以向我解释一下吗 Thanks Select Main storyboard in
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • 我的游戏中应该有多少个视图控制器?

    我开始使用 spritekit 构建我的第一个游戏 现在我只有一个视图控制器来呈现开始屏幕场景 override func viewDidLoad super viewDidLoad let scene StartScreenScene C
  • 当强制退出/向上滑动以终止 iOS 应用程序而不点击横幅/警报时,如何获取推送通知有效负载?

    我正在构建一个应用程序来处理从 Parse 推送的通知 并尝试创建通知历史记录功能 我已经成功启用了后台模式 因此当应用程序在后台运行时 应用程序可以通过以下方式很好地获取有效负载application didReceiveRemoteNo
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • 避免 UIImage 的 imageNamed - 内存管理

    我正在经历这个链接 http akosma com 2009 01 28 10 iphone memory management tips 我遇到了一个点避免 UIImage 的 imageNamed 出于什么原因我们应该避免这种情况 它会
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • 苹果推送通知在生产中不起作用

    我们完全陷入困境 请帮忙 我和我的团队制作了一个 iPhone 应用程序 这是我们第一次在 iOS 上尝试 一切都很好 直到我们提交应用程序并在应用程序商店上可用为止 推送通知服务无法正常工作 我在网上搜索并尝试根据人们的建议仔细检查我们的
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们
  • Xcode 存档上传失败并出现错误

    我正在尝试从 xCode 将新版本上传到 iTunesConnect 但每次我都会遇到此问题 问题是什么 我该如何解决这个问题 最近 我开始在上传过程中遇到问题 Xcode 经常卡住 最终会因您看到的第二个错误而失败 受够了一段时间后 我转
  • 核心数据 NSFetchRequest 还获取实体的子对象

    我是 iOS 开发和 Core Data 的新手 我有一个父 NSManagedObject class Units interface Properties NSManagedObject property nonatomic retai
  • 在 swrevealcontroller 之前实现登录屏幕

    我刚刚开始学习 IOS 开发 我已经按照给定的在线教程成功实现了 SWRevealViewController 一切都按预期工作 然后 我决定添加一个登录屏幕 这将是应用程序运行时用户看到的第一个页面 我采取的步骤如下 将 UIViewCo
  • 在 Xcode 5.1 中构建时,“您必须提供 5.5 英寸 Retina 显示屏的屏幕截图,因为您的应用程序二进制文件支持 5.5 英寸 Retina 显示屏”

    我更新了一个旧应用程序并修复了一些小错误 该应用程序是使用 Xcode 5 1 编译的 无法使用资产目录或添加 iPhone 6 和 6 Plus 图像 但当我尝试提交它进行审查时 我仍然收到此错误 您必须提供 4 7 英寸 Retina
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 多次添加同一个子视图来查看

    我不知道这是否可行 但我想做的是将子视图多次添加到视图中 我尝试过这样的事情 self view addSubview newView newView center CGPointMake 160 100 self view addSubv
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR

随机推荐