在启用 ARC 的 C 代码中执行 Objective-C 代码时出现运行时内存泄漏警告

2023-12-12

ARC 已启用并且bufferReady正在由 C++ 库(未启用 ARC)触发,并且我确信我在某处缺少 ARC 转换。请指教。提前致谢。

使用下面的代码:

@implementation HelloWorldLayer

id refToSelf;  //reference to self
int shakeCounter = 0;

void bufferReady() {
    if (shakeCounter % 100 == 0) {
        [refToSelf shakes];
    }

    shakeCounter++;
}

- (void) shakes {
    CCRotateBy * rotate = [CCRotateBy actionWithDuration:0.1 angle:2];
    CCActionInterval * rotateReverse = [rotate reverse];
    CCSequence * seq1 = [CCSequence actions:rotate, rotateReverse, nil];

    CCMoveBy * shake = [CCMoveBy actionWithDuration:0.1 position:ccp(5, 0)];
    CCActionInterval * shakeReverse = [shake reverse];
    CCSequence * seq2 = [CCSequence actions:shake, shakeReverse, nil];

    CCSpawn * spawner = [CCSpawn actions:seq1, seq2, nil];
    CCSequence * lastSequence = [CCSequence actions:spawner, spawner, spawner, spawner, nil];

    [self runAction:lastSequence];
}

- (id) init {
    if((self = [super init])) {
        ...
    }
    refToSelf = self;
    return self;
}

在运行时我每次都会收到内存泄漏警告shakes被执行。

objc[10060]: Object 0x466830 of class CCRotateBy autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x44cb70 of class CCRotateBy autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x46b260 of class CCSequence autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x45a790 of class CCMoveBy autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x469150 of class CCMoveBy autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x469190 of class CCSequence autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x46b350 of class CCSpawn autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x46b380 of class CCSequence autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x46b3b0 of class CCSequence autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[10060]: Object 0x46bc00 of class CCSequence autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

您不会错过“ARCcast”。

我猜你的 C++ 创建了一个单独的线程并调用bufferReady在那条线上。由于它是一个 C++ 库,我认为它对 Objective-C 或 Cocoa 内存管理一无所知,因此它不会创建自动释放池。所以you应该创建一个自动释放池bufferReady:

void bufferReady() {
    if (shakeCounter % 100 == 0) {
        @autoreleasepool {
            [refToSelf shakes];
        }
    }

    shakeCounter++;
}

但我也看到shakes,您正在创建 Cocos2D 对象并发送runAction:对您自己来说,可能是为了运行您创建的操作对象。您确定在随机线程上执行此操作安全吗?也许你应该发送自己shakes在主线程上。这是一个简单的方法:

void bufferReady() {
    if (shakeCounter % 100 == 0) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [refToSelf shakes];
        });
    }

    shakeCounter++;
}

由于主线程管理自己的自动释放池,因此在这种情况下您不必设置自动释放池。

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

在启用 ARC 的 C 代码中执行 Objective-C 代码时出现运行时内存泄漏警告 的相关文章

随机推荐

  • Xerces DOM 解析器非常慢?

    目前 我正在尝试使用 JTidy 清理 HTML 文件 将其转换为 XHTML 并将结果提供给 DOM 解析器 以下代码是这些努力的结果 public class HeaderBasedNewsProvider implements INe
  • 如何将 json 响应从控制器发送到 jQuery 并检查它?

    我有这个问题 我正在控制器中检查用户电子邮件并发送 json 成功响应 如果已采用 并添加输入的 css 样式 我还需要阻止提交并添加一些消息 这是我的检查电子邮件操作 使用本文 http paydrotalks com posts 45
  • 在 JavaScript 中使用 Razor

    是否可能或是否有解决方法可以在视图中的 JavaScript 中使用 Razor 语法 cshtml 我正在尝试向 Google 地图添加标记 例如 我尝试了此操作 但遇到了大量编译错误
  • 如何访问目标c文件中的swift公共函数?

    我使用如下公共方法将 API 数据类型转换为 Int public func convertToInt value Any gt Int if let v value as String if let myNumber NSNumberFo
  • 如何修复 xml 文件谷歌地图中的错误“您已超出此 API 的每日请求配额”?

    我尝试使用此链接来获取方向 但今天它不起作用 请帮我
  • RegEx 使用通配符验证 IP 地址

    我似乎无法获得用于验证 IP 地址的正确正则表达式 包括对通配符 的支持 该字符只能出现在末尾 例如 Valid 1 2 1 2 3 1 2 3 4 无效 1 1 2 1 2 1 2 3 1 2 3 1 3 4 我已经接近了 并在这里发现了
  • 如何使用 scipy.optimize.curve_fit 在 python 上拟合良好的洛伦兹分布?

    我正在尝试拟合具有多个吸收峰 穆斯堡尔谱 的洛伦兹函数 但 curve fit 函数无法正常工作 仅拟合几个峰值 我怎样才能适应它 图 尝试调整多洛伦兹 下面我展示我的代码 请帮我 import numpy as np import mat
  • 将 Firebase Web 应用程序链接到 Firebase 托管网站会带来什么好处?

    我应该在控制台中将 Web 应用程序链接到 Firebase 托管网站有何用途 有什么好处和作用 这里介绍了两者之间的区别 firebase web 应用程序和 firebase 托管之间有什么区别 文档中提到了链接https fireba
  • 如何使用当前图像文件名预填充 WTForm FileField?

    当用户想要使用 WTForm 更新帖子时 如何预先填充表单上的 FileField 输入 以便它显示当前图像名称 目前 用户每次更新帖子的其他方面时都必须上传相同的图像 否则当前图像将被删除 因为帖子更新时没有图像 我目前如何预先填写表格
  • 处理继承时重写 equals 方法

    我一直在阅读有关在处理子类时如何最好地重写 equals 方法的内容 在这里我发现了很多帖子 他们推荐使用 instanceof 或 getClass 来实现解决方案的不同方法来比较不同子类的对象 然而 参考 Effective Java
  • PHP:如何优雅地管理错误?

    当无法访问网络上的某些内容 api 数据库 时 我如何停止执行脚本的其余部分并将错误记录在日志文件中 好吧 这样访问者就不会看到确切的原因 而是会看到我的自定义消息 例如 刚刚发生了一件坏事 我需要采取哪些步骤来安排事情 我一般喜欢使用例外
  • 来自 JavaScript 的 Opencart 成功订单 ID 和总计

    我需要在成功订单的页面上运行 JavaScript 并获取两件事 订单 ID 和订单总金额 代码如下 问题 我应该将脚本粘贴到哪里 如果进入 success tpl 则具体在哪里 如果进入header tpl比如何只在成功命令的页面上运行它
  • Google OAuth 登录在本地工作,在生产服务器上失败

    我正在开发一个网站 刚刚发布了测试版 目前与生产环境位于同一服务器上 这是一个个人项目 用户可以选择使用 MVC 4 SimpleMembership 提供程序通过 OAuth 使用 Google Facebook 或 Twitter 帐户
  • 输入属性未接收数据

    我正在尝试将数据传递到我的组件 这是组件的代码 export class requestDetailComponent Input id Input name Input email Input purpose Input programm
  • 在 Windows 批处理文件中嵌入 VBScript

    是否可以将 VBScript 嵌入到批处理文件中 我目前有一个 CMD 文件 它使用以下命令调用 VBS 文件 cscript NoLogo MyScript vbs 但我更愿意只分发一个 CMD 文件 EDIT 有一个类似的问题 其答案是
  • 带有寻呼机 TopAndBottom 的 GridView

    我在 ASP NET 中扩展了标准 GridView 控件 基本上是一样的 但是分页和排序是使用回调完成的 我已经成功创建了自己的 PagerTemplate 但它仅在 PagerSettings Position 设置为 Top 时才有效
  • 数据库模式,自动增量

    这里有数据库问题 是否可以对二级或三级 ID 进行自动增量 我需要制作一些基于版本的东西 所以想象一下 ID Phrase PhraseID PhraseVersion 1 1 1 2 1 2 3 1 3 4 2 1 添加到数据库时 Phr
  • Android通知图标问题

    我有一个奇怪的问题 我有两种方式在 Android 应用程序中发送通知 一个来自 Android 服务 另一个通过 FCM 场景如下 无论应用程序是否正在运行 从 Android 服务发送的通知的图标都会正确显示 当应用程序运行时 如果我通
  • 绑定(这个)是什么意思?

    我已经知道绑定的作用是将给定的对象或函数绑定到您想要的函数 但是bind this 这真的让我很困惑 是什么意思this in bind真正意思 下面是我的带有 firebase 数据库的 React 应用程序的代码 componentWi
  • 在启用 ARC 的 C 代码中执行 Objective-C 代码时出现运行时内存泄漏警告

    ARC 已启用并且bufferReady正在由 C 库 未启用 ARC 触发 并且我确信我在某处缺少 ARC 转换 请指教 提前致谢 使用下面的代码 implementation HelloWorldLayer id refToSelf r