- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图编写一些代码,当任何对象通过调配 -[NSObject dealloc]
方法被释放时将被调用。我知道这是一个坏主意并且不会去追求它(所以请不要指出这一点),但在此过程中我发现像 NSDictionary 和 NSString 这样的类是免费的,可以与 CFDictionary 这样的核心基础对应物桥接和 CFString 在最终发布时不调用 -dealloc
。
这段代码演示了这种现象:
- (void)loggedDealloc {
NSLog(@"Deallocation of %@", self.class);
[self loggedDealloc];
}
- (void)testDeallocSwizzleOnTestObject {
Method deallocMethod = class_getInstanceMethod([TestObject class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
TestObject * testObject = [[TestObject alloc] init];
testObject = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
- (void)testDeallocSwizzleOnNSDictionary {
Method deallocMethod = class_getInstanceMethod([NSDictionary class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
NSDictionary * dictionary = [[NSDictionary alloc] init];
dictionary = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
- (void)testDeallocSwizzleOnNSString {
Method deallocMethod = class_getInstanceMethod([NSString class], NSSelectorFromString(@"dealloc"));
Method loggedDeallocMethod = class_getInstanceMethod([self class], @selector(loggedDealloc));
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
NSDictionary * dictionary = [[NSDictionary alloc] init];
dictionary = nil; // calls release under ARC
method_exchangeImplementations(deallocMethod, loggedDeallocMethod);
}
在上面的测试中,只有 TestObject 的 swizzling 会导致发生释放记录。 NSDictionary 和 NSString 的调配没有任何效果。
我怀疑这是因为免费桥接类实现了 -release
来执行 CFRelease 而不是调用 [super release]
,因此内存被 Core 释放根本没有调用 -dealloc
。
任何人都可以确认是这种情况并且在任何地方都有记录吗?如果是这样,是否有任何方法可以将自定义代码注入(inject)到这些免费桥接类的释放中?
最佳答案
(嘿。去过那里。完成了。:)
对 dealloc
的调用只保证对各种类的子类。有许多类——主要是各种 CF/NS 桥接类——永远不会调用 dealloc
,因为永远不需要这样做 [内部实现细节]。
做你想做的事,将所需的类子类化,将原始类的实例封装为后备存储,然后覆盖原始方法(每个类集群类都有一个非常小的集合原始方法——我认为 NSString
具有所有 2 种方法),然后覆盖该新类上的内存管理方法。因为它是一个子类,所以您在现有类中看到的“短路”将不再起作用。
关于objective-c - 为什么与 Core Foundation 对应的免费桥接类在最终发布时不调用 -dealloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827937/
前言 俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
正在学习有关 C 语言链接列表的教程。我已编译此代码并通过 valgrind 运行它。它显示了 4 次分配和 0 次释放,这是我理解的。我需要知道如何正确调用 free() 来释放分配。 代码示例:l
正如标题所说,我需要一个搜索引擎...用于mysql 搜索。我的网站是基于 PHP 的。 我打算使用 sphinx,但我的托管公司不支持全文索引! 所以一个没有全文的搜索引擎! 它应该是相当强大的,并
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我正在寻找稳定和成熟的免费/开源库来比较两个图像。 我找到了这个,但我想知道你是否使用更好的! Similar images finder - .NET Image processing in C#
我有一个通用链表实现,其中包含一个指向数据的 void* 的节点结构和一个包含对头的引用的列表结构。现在这是我的问题,链表中的一个节点可能通过其 void* 持有对另一个链表的引用。当我释放包含较小列
前言 今天大姚给大家分享一款开源(MIT License)、免费、现代化风格的WPF UI控件库:ModernWpf。 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化
LiveCharts2 LiveCharts2是一个.NET开源(MIT License)、简单、灵活、交互式且功能强大的.NET图表、地图和仪表,现在几乎可以在任何地方运行如:Maui、Uno P
前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、实用的多功能原神工具箱,旨在改善桌面端玩家的游戏体验:胡桃工具箱。 工具箱介绍 胡桃工具箱是一款.NET开源(MIT
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 3年前关闭。 Improve this qu
当我这样做时,我的 meteor 应用程序运行的免费服务器的规范是什么。 meteor deploy myapp.meteor.com 规范方面 Storage size Max bandwidth
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
如果可能,我可以使用任何网络服务免费存储少量数据(考虑 XML 或 JSON)? 我想我想创建一个小型待办事项应用程序,只是探索/学习(最好是免费的),它还可以将数据备份到云端,以便他们可以在智能手机
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Improve this qu
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否有任何免费/开源替代 Codesmith 可以在功能上进行比较并生成 .NET 代码? 最佳答案 几年前我做了同样的研究,发现 MyGeneration 成为 非常好。 关于.net - 免费 C
在尝试找到可以逐步执行/允许线程的haskell monad时,我发现了免费的monad data Free f a = Return a | Roll (f (Free f a)) 及其 monad
我是一名优秀的程序员,十分优秀!