问题标签 [manual-retain-release]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
36 浏览

objective-c - 发布消息后,Objective-C 对象不会被销毁

我被这个程序的输出结果弄糊涂了。

类本身是

结果是输出结果

主要问题是为什么方法sayHello被执行,尽管对象本身被破坏,因为它的保留计数是0通过发送release消息设置的?更重要的是,如果我通过调试器完成程序流程,应用程序将崩溃,因为human指针不再是对象。这里发生了什么事?

PS ARC 已关闭

提前致谢。

0 投票
0 回答
79 浏览

objective-c - 在 Objective-C 生成的代码中 Protobuf 缺少“列表”后缀

我将 protobuf 2.6.1 与我自己编译的这个插件一起使用。

在我正在使用的项目中,Protobuf 模型已经存在。我尝试使用以下命令重新生成文件:

protoc --plugin=/path/to/the/compiled/plugin/objc-gen --objc_out=./gen/ NAME.proto OF.proto THE.proto FILES.proto

通常,这些文件与先前生成的模型非常匹配,但是存在一些语法差异。

以下 .proto 字符串:

在 Obj-C 中被翻译成这一行(新插件,带有 ARC):

而且它曾经带有List后缀(旧插件,非ARC,不适用于当前版本的macOS):

鉴于这case是 Objective-C 中的关键字,这会触发编译错误。

问题:

  1. 由于什么版本的 Protobuf 更改了语法以省略List后缀?

  2. 是否可以使用新插件触发“旧”行为?

  3. 在 macOS 10.14.3 上运行并能够生成具有旧样式(即带有list 后缀)的文件的最后一个插件版本是什么?

0 投票
1 回答
54 浏览

properties - NSStringto 类成员分配崩溃

我正在开发 C++ 和 Objective-C++ 应用程序。我有 C++ 类,它调用 Objective-c++ 类。在 c++ 标头中,我正在创建 void* ,如下所示:

然后在构造函数中我像这样实例化objective-c++:

在析构函数中我这样做:

Objective-C++ 类有这个接口:

它的初始化方法:

及其析构函数:

我从 C++ 调用 Objective-C++ 方法,如下所示:

相关方法如下:

C++ 类被销毁并重新创建。问题是,在我重新创建类并调用 getData1 方法时销毁类后,我在这里遇到了崩溃:

使用调试器堆栈跟踪检查显示该调用,然后显示 objc_msgSend。我已阅读,似乎崩溃可能是由于额外的释放或损坏。

有人可以帮我理解发生了什么吗?

提前致谢和问候

0 投票
2 回答
230 浏览

nsdate - 未对齐的指针与 std::shared_ptr 一起使用取消引用

我正在一个遗留代码库中工作,其中包含大量使用手动保留/释放编写的 Objective-C++。内存使用大量 C++ 进行管理,并在调用包含对象的std::shared_ptr<NSMyCoolObjectiveCPointer>构造时传入了一个合适的删除器。release这似乎很好用;但是,当启用 UBSan 时,它会抱怨指针未对齐,通常是在取消引用 shared_ptrs 以执行某些工作时。

我已经搜索了线索和/或解决方案,但是很难找到有关 Objective-C 对象指针来龙去脉的技术讨论,更难找到有关 Objective-C++ 的任何讨论,所以我在这里。

这是一个完整的 Objective-C++ 程序,它演示了我的问题。当我使用 UBSan 在我的 Macbook 上运行此程序时,我在以下位置遇到了一个未对齐的指针问题shared_ptr::operator*

我在电话中得到了这个DateImpl::description

怀疑使用&*to “cast” shared_ptr<NSDate>to an 有问题NSDate*。我想我可以通过使用.get()shared_ptr 来解决这个问题,但我真的很好奇发生了什么。感谢您的任何反馈或提示!

0 投票
1 回答
128 浏览

ios - 如何重现罕见的“_CFAutoReleasePoolPop”崩溃?

我正在尝试重现此类崩溃: 在此处输入图像描述

我的项目中有手动引用计数。此外,还有很多多线程。有些属性不是线程安全的。:(
我对这次崩溃的原因只有一个假设:某些对象被过度释放(?)

我添加了自动化 UI 测试 ( Appium),但它们还没有帮助。
此外,我已经分析了Zombies- 一切似乎都很好。
另外,我尝试过 Xcode 的静态分析器(Product -> Analyze),有很多警告,但似乎都不是导致此类崩溃的原因(我已经查看了警告Incorrect decrement of reference count not owned at this point)。

我用 MRC 创建了一个测试项目,并添加了这样的代码:

在启用自动释放池或没有池的情况下,两次释放对象都不会崩溃。

所以我的问题是:
1.除了释放已经发布的对象之外,这种崩溃的另一个原因是什么?
2. 有没有办法增加重现此类崩溃的概率?例如一些环境。变量会降低一些自动释放池对不安全代码的容忍度?或者一些额外的自动释放池?
3. 为什么我的测试项目代码没有崩溃?

任何意见都受到高度赞赏。

0 投票
1 回答
67 浏览

cgeventtap - 在`NSEventTap`中返回我自己创建的`CGEvent`

CGEventTapCallBack 这里的文档说明:

CGEventRef 事件 传入事件。该事件归调用者所有,无需释放。

如果我想吃这个活动,然后返回,会发生什么NULL?我CFRelease应该自己做吗?

同样,如果我想用我自己创建的事件替换它,我应该CFRelease传入事件和CFRetain新创建的事件吗?

或者我是否受限于修改CGEvent就地接收的内容?确实是这样吗,有没有我可以使用热插拔的 API 调用?

0 投票
1 回答
285 浏览

ios - iOS:当对象设置为 nil 时,ARC 和 MRC 有什么区别?

在iOS 的MRC中,当一个对象设置为 nil 时,

据说会发生内存泄漏,因为 myObject 不会指向内存地址。它之前指向的记忆将会丢失。所以我们需要释放myObject,然后我们才能设置nil。有人可以帮助我理解,如果我们在 ARC 中将 nil 设置为 myObject 会发生什么?如果我们有这样的事情

  1. [myObject release]当我们设置ARC 会调用myObject = nil吗?
  2. 这会导致内存泄漏吗?
  3. [myObject_another release]当我们设置时它也会调用myObject = nil吗?

请帮助我了解 ARC 和非 ARC 之间的区别。

0 投票
1 回答
147 浏览

swift - NSOutlineView 在低于 10.12 的 Mac OS 版本上崩溃,因为默认情况下“stronglyReferencesItems”设置为“false”

我的应用程序有一个大纲视图,可以从服务器频繁更新。每当我收到更新时,我都会重新加载大纲视图。我同时对轮廓进行多项操作,例如在鼠标悬停时显示一些按钮、展开/折叠项目。对于这些操作,我从大纲视图中获取项目NSOutlineView.item(atRow:)

问题是,在随机情况下,我的应用程序在低于 10.12 的操作系统版本上内部调用委托方法EXC_BAD_ACCESS (SIGSEGV)的区域崩溃。我知道操作系统版本 10.12 中的项目有自己的保留和发布周期,默认设置为。所以崩溃不会发生在 10.12 以上。NSOutlineViewNSTableViewNSOutlineViewstronglyReferencesItemstrue

那么我该如何解决这个问题呢?有人可以指导我如何手动保留和释放传递给NSOutlineView较低版本的项目。

简单地说,我需要在 10.12 以下的版本中启用stronglyReferencesItemsset to的行为。true

注意:正如我上面所说,我会执行复杂的操作,NSOutlineView例如移动事件、展开/折叠(在某些情况下展开所有项目)、使用服务器频繁更新重新加载列表。所以在这里提到我的代码会很复杂。

以下是供您参考的崩溃日志之一:

0 投票
0 回答
42 浏览

swift - Swift:ARC 如何处理匿名对象?

ARC 多年前出现以取代痛苦的 MRC,但由于 ARC 只是一种编译器技术,它的魔力发生在编译时。所以,基本上它的作用 - 在适当的地方自动插入retainrelease调用。所以,现在我的问题来了 - ARC 如何处理以下示例

对象是用创建的ref count == 1(据我所知,至少在旧的 MRC objcallocnewcopy在哪里调用retain。如果我错了,请纠正我),所以编译器必须减少这些对象的引用计数才能释放它们?但是这是如何完成的,因为这些对象实际上没有引用,它们是匿名的!我假设编译器可能会做以下优化

我的意思是编译器将引用匿名对象,以便能够调用release它。但是,我不确定这正是它的工作原理!那么,有人可以解释一下在这种情况下实际发生了什么吗?
亲切的问候,
安德烈

0 投票
2 回答
61 浏览

ios - Deinit 未调用 - 无法找到保留某些内容的原因(提供的代码)

我发现我的 UIViewcontrollerdeinit()在以下情况下没有调用。我正在使用这个代码扩展,通过添加点击手势识别器让我的生活更轻松。

https://gist.github.com/saoudrizwan/548aa90be174320fbaa6b3e71f01f6ae

我在我的一个 VC 中使用了这段代码,我已经将其精简到最少的代码量:

viewDidLoad()我这样做了:

看来该行:

是问题所在 - 当我将这一行留在该闭包中时,deinit()不会调用我的 VC。当我取出上述线路或将其替换为诸如print("hello world") deinit()正确调用之类的内容时。txt主题是 @IBOutlet weak var txtSubject: UITextField!

我不完全确定在这里做什么。我读到,当你触发时becomeFirstResponder(),你打电话很重要resignFirstResponder(),但即使我不点击标签(以免给becomeFirstResponder()机会打电话)我仍然无法击中deinit()

有什么想法可以让我进一步了解吗?

非常感谢。