- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
序言;这不是一般性的“我有一个存在泄漏的巨型应用程序”问题。这是一个关于自动引用计数在几乎微不足道的演示应用程序中无法正常工作的特定问题,具有完整的源代码,或者微妙的代码生成或编译器问题,或者 Instruments 中的错误。 (TLDR:哦。实际上是一个奇怪的小竞争条件)
我对 Instruments 的“分配”列表显示实例泄漏这一事实感到困惑,然而,我有该类的一个实例,只有一个,ARC 导致调用 dealloc 方法,我知道它是被调用是因为在 dealloc 完成时打印了一条 NSLog 消息,但它仍然显示在 Instruments 的泄漏列表中。
retainCount 永远不会超过 1。它没有被任何人保留,并且正在被释放,但它看起来像是一个“泄漏”,因为它在 Instrument 的泄漏中显示为一个事件实例。
这怎么可能?
我仍在学习使用 ARC 的 Objective-C,所以我想我一定犯了一个常见的初学者错误。这是我唯一的初始化和对象的 dealloc:
- (id) initWithMessage:(NSString*)messageForUser
{
self = [super init];
if (self)
{
_message = messageForUser;
NSLog( @"from constructor: %@",_message);
}
return self;
}
- (void)dealloc {
NSLog(@"Goodbye cruel world. One WPMyObject signing off.");
// [message release]; // ARC forbiddeth thee! Begone release.
_message = nil;
// [super dealloc]; // ARC forbiddeth explicit super dealloc
}
只是为了看看我是否可以,我尝试在 dealloc 方法中调用 [super dealloc]
,ARC 以错误阻止你,这很棒,因为它会为你做那件事。但是,当我编写自己的 init 方法时,它不会阻止我。
当我在 XCode 中使用“Run”运行程序时,我收到了“再见,残酷的世界”NSLog 消息,正如我希望的那样,当 dealloc 运行时,我也得到了这个实例仍然存在于运行结束,当使用 Instruments analysis using memory leaks template 时:
如果我在没有下面的实例创建代码的情况下运行,我只会收到一些标准库 malloc 泄漏报告,但如果我添加此代码,所有泄漏都会发生:
WPMyObject * myObject = [[WPMyObject alloc] initWithMessage: @"Hello World!\n" ];
这是我所看到的,我想我的理解是告诉我 WPMyObject 的唯一实例正在泄漏:
完整的源代码非常简单(一个使用 Objective-C 和 Foundation/Foundation.h
的微型 Mac OS X 命令行应用程序)在 BitBucket 上。点击this link在浏览器中查看源代码。
main.m 单元在 @autoreleasepool {...}
上下文语句中运行单个测试对象实例创建:
如果你想在自己的计算机上查看完全琐碎的代码,请像这样获取它:
hg clone https://bitbucket.org/wpostma/objectivecplaymac
更新:您可以通过在 }
结束自动释放池:
NSLog( @"Reached end of autorelease pool" );
是的。添加日志消息。 “泄漏”消失了。这是 Mac OS X 10.7.5 上的 XCode 4.5.2 (4G2008a),包含 Instruments 版本 4.5(内部版本 4523)。
更新 2:这确实是一个简单的多进程竞争条件。下面的代码似乎是一个合理的黑客调试构建位。如果有更明确的方式说“等到 Instruments 完成我的工作,然后退出 main()”,这可能是一个不错的 future 功能,Apple 工程师。一个 PROFILER_SYNC("MESSAGE") 宏,它在 Release模式下扩展为空,但在调试版本中,将“MESSAGE”发送到分析器......它确实非常方便。
int main(int argc, const char * argv[])
{
// This creates and cleans up an auto-release pool context.
@autoreleasepool {
foo(); // Microscopic amounts of debug code you want profiler to analyze go here.
#ifdef DEBUG
usleep(10000); // race condition prevention in debug builds, so Instruments can finish up.
#endif
}
#ifdef DEBUG
usleep(10000); // race condition prevention in debug builds, so Instruments can finish up.
#endif
return 0;
}
最佳答案
听起来不像泄漏,更像是竞争条件。写入 NSLog
与程序执行终止之间的竞争。或者更有可能是缓冲问题,在达到特定阈值之前不会刷新输出。
尝试在自动释放池的右大括号之后放置一个 sleep(100);
。或者尝试在 dealloc
中的日志消息中添加更多文本。
如果这不能“修复”它,则显示反汇编代码并查看两个版本的代码之间有何变化。
发生这种情况的原因:出于性能原因,Instruments 和 NSLog() 都进行了有效缓冲。它们设计用于运行时间相对较长的进程,该进程几乎总是有一个主事件循环或调用 dispatch_main()
。
这样做是为了尽量减少对目标应用程序性能的影响,但它可能会导致微基准测试出现异常,因为该过程的生命周期极短。
如果您在一个短暂的过程中有一个最小的测试用例,我建议使用 [[NSRunLoop currentLoop] run];
关闭 main()
。这将永远运行,并为 Instruments 和/或调试器提供一个可行的运行时。
关于ios - XCode 4.5 中 ARC 的 Phantom 内存泄漏,其中肯定调用了 dealloc 或 Instruments 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261879/
我正在观看来自 iTunes U. 的视频讲座,其中讲师展示了如何使用 Xcode 的调试器部分并能够将该窗口从主窗口拉开。 不幸的是,视频显示了如何在 Xcode3 中执行此操作的说明。如何在 Xc
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
现在我正在开发一个使用 Markdown 的静态网站。我不想在 SublimeText 中编辑文件,而是想在 Xcode 中编辑它们。我可以在 Xcode 中打开各个文件,但我想打开整个静态站点目录并
我真的厌倦了其他用户的项目错误,因为 XCode 的默认类引用类型是“相对于 XCode 文件夹”。我知道您可以将其更改为“相对于封闭组”,这就是我们的项目,但是任何时候有人创建一个新的类文件并且忘记
我对 Xcode 一无所知,除了它是来自 Apple 的开发人员界面,它实际上来自 OSX CD,它也用于创建 iPhone 应用程序。 我也知道它有一个 Applications 文件夹,里面装满了
更新 Xcode(从 7.2 到 7.2.1)后,XcodeServer 无法运行 Xcode Service。当我选择更新的 Xcode 时,提示消息:Enable Accessibility ac
我很难找到有关新 XCode 布局的信息。如何查看源文件的反汇编,而不仅仅是 C++ 代码? 最佳答案 在 Xcode 4.2(和 Xcode 5)中,您可以通过以下方式查看文件的汇编或反汇编: 显示
我在 XCode 中为我的项目添加了一个文件夹并将其命名为 Themes,它将用于存储我的 iPad 应用程序的主题。在那下面我有红色、蓝色等等。 它们出现在 XCode 中。但是当我查看物理文件夹时
作为我之前 How can I create a reference cycle using dispatchQueues? 的后续: 对于强引用(会造成泄漏,但不是循环引用),例如Timer、Dis
我有一台 macbook air,我去商店安装 Xcode 7.3 并点击更新 App 按钮,然后出现了一个加载图标,但等待 30 分钟后什么也没发生。我从商店成功安装了 simple recorde
我的项目现在有一个project.xcworkspace/xcshareddata目录。 Xcode在project.xcworkspace/xcshareddata目录中存储什么? 最佳答案 xcs
我不经常使用 XCode 进行开发,最近 MacPorts 告诉我我需要获得 3.1 才能使包工作。我去了苹果,他们为我提供了最新版本,结果只适用于 OSX 6。因为我有 OSX 5,它对我没有任何帮
有谁知道如何强制 Xcode 停止运行。我更新到 6.2 但现在它不能正常工作。我需要退出 Xcode 才能完成更新或卸载并重新安装。菜单中的相当 Xcode 不可用。无法将其拖到垃圾箱,因为它说它仍
我最近从我的项目中删除了一些旧的测试类并删除了文件。正如预期的那样,文件被移到垃圾箱并在 git 中显示为已删除。 不幸的是,测试类和它们定义的测试用例继续出现在测试导航器中。我已经尝试过常见的疑点,
Xcode 中的场景编辑器显示大小但不显示单位。它是以英寸为单位的尺寸还是以米为单位的尺寸? 例如,当我选择一个节点时,例如一个盒子,当我在节点检查器中检查它的属性并在“边界框”旁边的“变换”部分检查
只想知道 xcode 项目中事件可执行文件的目的是什么? 谢谢 索拉布 最佳答案 自己找到了..希望它会帮助某人。 您可以在其中运行和测试软件产品的可执行环境。可执行环境定义了应该用来运行产品的程序。
刚回到我的办公 table ,Xcode 一直在文件中突出显示/强调空白区域。如果我输入一些东西它就会消失,但如果我切换标签并回来,它们会重新出现。 更新:这不是由“显示隐形”选项引起的。那看起来不一
我首先注意到这一点 Cmd-/偶尔拒绝为注释取消注释的代码行工作。但是现在(刚刚使用 XCode 4.1,虽然这可能无关)它发生在 Cmd-B建立。 我无法弄清楚我正在做什么导致这种情况,或者是否有任
我不太了解Xcode 4的工作区的实用程序。它们的用途是什么,它们如何帮助Xcode进行开发? 最佳答案 例如。您有一个在两个应用程序中使用的库。您很可能为此库拥有一个自己的项目,对吗?现在,您可以自
我正在关注一个应用程序教程,它说: “接下来,在 Xcode 应用程序项目目录的根目录下创建一个空文件,并调用该文件 Podfile。使用您喜欢的文本编辑器打开它,然后在其中粘贴以下行:” 我很困惑这
我是一名优秀的程序员,十分优秀!