问题标签 [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.
objective-c - 发布消息后,Objective-C 对象不会被销毁
我被这个程序的输出结果弄糊涂了。
类本身是
结果是输出结果
主要问题是为什么方法sayHello
被执行,尽管对象本身被破坏,因为它的保留计数是0
通过发送release
消息设置的?更重要的是,如果我通过调试器完成程序流程,应用程序将崩溃,因为human
指针不再是对象。这里发生了什么事?
PS ARC 已关闭
提前致谢。
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 中的关键字,这会触发编译错误。
问题:
由于什么版本的 Protobuf 更改了语法以省略
List
后缀?是否可以使用新插件触发“旧”行为?
在 macOS 10.14.3 上运行并能够生成具有旧样式(即带有
list
后缀)的文件的最后一个插件版本是什么?
properties - NSStringto 类成员分配崩溃
我正在开发 C++ 和 Objective-C++ 应用程序。我有 C++ 类,它调用 Objective-c++ 类。在 c++ 标头中,我正在创建 void* ,如下所示:
然后在构造函数中我像这样实例化objective-c++:
在析构函数中我这样做:
Objective-C++ 类有这个接口:
它的初始化方法:
及其析构函数:
我从 C++ 调用 Objective-C++ 方法,如下所示:
相关方法如下:
C++ 类被销毁并重新创建。问题是,在我重新创建类并调用 getData1 方法时销毁类后,我在这里遇到了崩溃:
使用调试器堆栈跟踪检查显示该调用,然后显示 objc_msgSend。我已阅读,似乎崩溃可能是由于额外的释放或损坏。
有人可以帮我理解发生了什么吗?
提前致谢和问候
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 来解决这个问题,但我真的很好奇发生了什么。感谢您的任何反馈或提示!
ios - 如何重现罕见的“_CFAutoReleasePoolPop”崩溃?
我的项目中有手动引用计数。此外,还有很多多线程。有些属性不是线程安全的。:(
我对这次崩溃的原因只有一个假设:某些对象被过度释放(?)。
我添加了自动化 UI 测试 ( Appium
),但它们还没有帮助。
此外,我已经分析了Zombies
- 一切似乎都很好。
另外,我尝试过 Xcode 的静态分析器(Product -> Analyze
),有很多警告,但似乎都不是导致此类崩溃的原因(我已经查看了警告Incorrect decrement of reference count not owned at this point
)。
我用 MRC 创建了一个测试项目,并添加了这样的代码:
在启用自动释放池或没有池的情况下,两次释放对象都不会崩溃。
所以我的问题是:
1.除了释放已经发布的对象之外,这种崩溃的另一个原因是什么?
2. 有没有办法增加重现此类崩溃的概率?例如一些环境。变量会降低一些自动释放池对不安全代码的容忍度?或者一些额外的自动释放池?
3. 为什么我的测试项目代码没有崩溃?
任何意见都受到高度赞赏。
cgeventtap - 在`NSEventTap`中返回我自己创建的`CGEvent`
CGEventTapCallBack
这里的文档说明:
CGEventRef 事件 传入事件。该事件归调用者所有,无需释放。
如果我想吃这个活动,然后返回,会发生什么NULL
?我CFRelease
应该自己做吗?
同样,如果我想用我自己创建的事件替换它,我应该CFRelease
传入事件和CFRetain
新创建的事件吗?
或者我是否受限于修改CGEvent
就地接收的内容?确实是这样吗,有没有我可以使用热插拔的 API 调用?
ios - iOS:当对象设置为 nil 时,ARC 和 MRC 有什么区别?
在iOS 的MRC中,当一个对象设置为 nil 时,
据说会发生内存泄漏,因为 myObject 不会指向内存地址。它之前指向的记忆将会丢失。所以我们需要释放myObject,然后我们才能设置nil。有人可以帮助我理解,如果我们在 ARC 中将 nil 设置为 myObject 会发生什么?如果我们有这样的事情
[myObject release]
当我们设置ARC 会调用myObject = nil
吗?- 这会导致内存泄漏吗?
[myObject_another release]
当我们设置时它也会调用myObject = nil
吗?
请帮助我了解 ARC 和非 ARC 之间的区别。
swift - NSOutlineView 在低于 10.12 的 Mac OS 版本上崩溃,因为默认情况下“stronglyReferencesItems”设置为“false”
我的应用程序有一个大纲视图,可以从服务器频繁更新。每当我收到更新时,我都会重新加载大纲视图。我同时对轮廓进行多项操作,例如在鼠标悬停时显示一些按钮、展开/折叠项目。对于这些操作,我从大纲视图中获取项目NSOutlineView.item(atRow:)
问题是,在随机情况下,我的应用程序在低于 10.12 的操作系统版本上内部调用委托方法EXC_BAD_ACCESS (SIGSEGV)
的区域崩溃。我知道操作系统版本 10.12 中的项目有自己的保留和发布周期,默认设置为。所以崩溃不会发生在 10.12 以上。NSOutlineView
NSTableView
NSOutlineView
stronglyReferencesItems
true
那么我该如何解决这个问题呢?有人可以指导我如何手动保留和释放传递给NSOutlineView
较低版本的项目。
简单地说,我需要在 10.12 以下的版本中启用stronglyReferencesItems
set to的行为。true
注意:正如我上面所说,我会执行复杂的操作,NSOutlineView
例如移动事件、展开/折叠(在某些情况下展开所有项目)、使用服务器频繁更新重新加载列表。所以在这里提到我的代码会很复杂。
以下是供您参考的崩溃日志之一:
swift - Swift:ARC 如何处理匿名对象?
ARC 多年前出现以取代痛苦的 MRC,但由于 ARC 只是一种编译器技术,它的魔力发生在编译时。所以,基本上它的作用 - 在适当的地方自动插入retain
和release
调用。所以,现在我的问题来了 - ARC 如何处理以下示例
对象是用创建的ref count == 1
(据我所知,至少在旧的 MRC objcalloc
中new
,copy
在哪里调用retain
。如果我错了,请纠正我),所以编译器必须减少这些对象的引用计数才能释放它们?但是这是如何完成的,因为这些对象实际上没有引用,它们是匿名的!我假设编译器可能会做以下优化
我的意思是编译器将引用匿名对象,以便能够调用release
它。但是,我不确定这正是它的工作原理!那么,有人可以解释一下在这种情况下实际发生了什么吗?
亲切的问候,
安德烈
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()
有什么想法可以让我进一步了解吗?
非常感谢。