请帮我跟踪iOS内存泄漏.谢谢!
我正在使用xCode 4.0.1,我尝试激活NSZombie来跟踪内存泄漏,但它似乎不像以前一样工作,使用xCode 3.x
我无法找到内存泄漏的来源,因为Instruments指出了这一点:
泄露的对象 - > GeneralBlock-32 地址 - > 0x4c8600 大小 - > 32字节 负责的库 - > libsystem_c.dylib 负责的框架/调用者 - > strup
此时我不知道如果我正在使用带有NSZombie的Instruments与xCode 4正确的方式,因为当我点击"i"获取更多信息时,它没有显示NSZombie选项,在左侧选项Leaks下.
观察:我的iPhone应用程序播放实时流mms/wma以及wma udioudio文件的时间有限.只有有限的wma文件才会发生泄漏,但是当我从流式源播放时没有结束时间,它会完美运行.
我对偶然发生的碰撞感到困惑,根据Zombies乐器的说法,这是由于一些字典值的过度释放造成的.当我查看Instruments中这些过度释放的对象之一的对象历史时,我发现它的保留计数在一个阶段从+2直接下降到0.(看一下帖子末尾的截图).我不清楚这是怎么可能的.
我应该说在使用Instruments进行分析时我只看到这种崩溃,所以我认为它可能是一个Apple漏洞,但是假设它是导航错误可能更安全,而Instruments只是暴露出来.
无论如何,我正在构建一个包含一些Core Foundation对象(CFStrings和CFNumbers)的CFDictionary,然后我将它转换为NSDictionary*并将其传递给Objective-C方法.我的代码的简化版本如下:
// creates a CFDictionary containing some CFStrings and CFNumbers
void doStuff()
{
CFDictionaryRef myDict = CreateMyDictionaryContainingCFTypes();
dispatch_async(myQueue, ^{
[someObject receiveDictionary:(NSDictionary*)myDict];
CFRelease(myDict); // this line causes a crash. The Zombies instrument
// claims a CFString value contained in this
// dictionary has already been freed.
});
}
// ...
- (void)receiveDictionary:(NSDictionary*)dict
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString* str1 = [dict objectForKey:@"key1"];
NSString* str2 = [dict objectForKey:@"key2"];
NSNumber* num1 = [dict objectForKey:@"key3"];
dispatch_async(myOtherQueue, ^{
[database executeUpdate:@"INSERT INTO …Run Code Online (Sandbox Code Playgroud) objective-c instruments nszombie grand-central-dispatch retaincount
我正在尝试优化iOS应用程序的内存使用量,我想看看应用程序的总内存使用量在代码中的特定点.我以为我应该能够设置断点,使用Activity Monitor配置应用程序,并查看每个断点捕获时的内存使用情况.但是当我运行Instruments时,似乎断点不再停止执行,因此很难确切知道内存使用何时发生变化.
是否可以同时使用断点和仪器?如果没有,是否有一种聪明的方法可以编写一些代码,以便在特定事件发生时将标记插入到仪器时间轴中?
我正在尝试为我的应用程序进行一些性能测试,并希望监视其某些指标,特别是cpu使用情况.我想让这个过程完全自动化.我能够创建.trace文件,并正在寻找一种解决方案,以从跟踪文件中获取有意义的信息.我想在非监狱破坏的设备上这样做,所以使用top也是不可行的
感谢您以自动方式在非监狱设备上查找CPU使用情况的任何指示.
-Kshitiz
图像处理应用程序在模拟器上快速运行,但在真实设备(iPhone 4GS)上运行速度非常慢.
在"instruments"下运行应用程序时,我看到以下调用树:

请注意,报告红色圆圈内的调用几乎占用了该方法的所有CPU时间.
有问题的方法是类方法(不是实例方法),具有以下代码:
@implementation Line2F
+ (CGFloat)signTested:(Point2F *)tested p1:(Point2F *)p1 p2:(Point2F *)p2
{
return [Line2F signTestedX:tested.x testedY:tested.y
p1x:p1.x p1y:p1.y
p2x:p2.x p2y:p2.y];
}
+ (CGFloat)signTestedX:(CGFloat)testedX testedY:(CGFloat)testedY
p1x:(CGFloat)p1x p1y:(CGFloat)p1y
p2x:(CGFloat)p2x p2y:(CGFloat)p2y
{
return (testedX - p2x) * (p1y - p2y) - (p1x - p2x) * (testedY - p2y);
}
@end
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么大部分的CPU时间花在[NSObject release]和[NSObject retain]?
颜色混合层 打开仪器并选择位于iOS/Graphics下的Core Animation模板.首先,单击Core Animation工具的时间轴以显示底部窗格,然后找到标有"Debug Options"的部分.选中"颜色混合图层"框,它将在混合的图层上显示红色叠加,并在未混合的图层上显示绿色叠加.
核心动画色彩混合层是否有用或者说是否有必要? 我发现系统UI是红色混合的.我的应用程序在某些方面也是红色混合的.
我该怎么办?
提前致谢.
从命令行运行UIAutomation我经常得到:
WebKit Threading Violation - initial use of WebKit from a secondary thread.
Run Code Online (Sandbox Code Playgroud)
注意,我正在使用-w旗帜,它在开头.这个答案没有帮助:WebKit Threading Violation - 在UI Automation中从辅助线程初始使用WebKit
任何想法如何避免?
====更新
只是让仪器不打印出来这将是有用的.
我遇到了使用Xcode 6.3 Beta 3的问题,其中Profiler没有在分配列表中显示任何自定义应用程序类:

我有多个包含单词Post的类,但它们都没有显示在分配摘要中,即使它们肯定显示在屏幕上.
我在Profiler中运行时将App目标设置为使用调试模式,因此我不确定导致此问题的原因.
在分配列表中搜索时,我可以看到我正在寻找的类所执行的分配,但没有跟踪类本身的分配历史记录:

知道哪个设置可能有问题?
我创建了一个子类SCNNode.它由很少的子节点组成.我已经宣布了一种方法,即.soundCasual()这会SCNAudioPlayer为此类的实例添加一个.当调用此方法时,一切都按预期工作并播放音频.无论何时轻敲该节点(手势),都会在该节点上调用此方法.
码:
class MyNode: SCNNode {
let wrapperNode = SCNNode()
let audioSource5 = SCNAudioSource(fileNamed: "audiofile.mp3")
override init() {
super.init()
if let virtualScene = SCNScene(named: "MyNode.scn", inDirectory: "Assets.scnassets/Shapes/MyNode") {
for child in virtualScene.rootNode.childNodes {
wrapperNode.addChildNode(child)
}
}
}
func soundCasual() {
DispatchQueue.global(qos: .userInteractive).async { [weak self] in
if let audioSource = self?.audioSource5 {
let audioPlayer = SCNAudioPlayer(source: audioSource)
self?.wrapperNode.removeAllAudioPlayers()
self?.wrapperNode.addAudioPlayer(audioPlayer)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
仪器内的问题(分配)
当我分析我的整个代码库(这是其他几件事)时,我看到每当我点击该节点时,SCNAudioPlayer的分配计数在Instruments内进行分析时增加1.但所有的增长都是持久的.根据定义SCNAudioPlayer,我假设玩家在播放后被移除,这就是为什么增量应该在瞬态分配中,但它不是这样工作的.这就是为什么我removeAllAudioPlayers()在向节点添加SCNAudioPlayer之前尝试过,正如您在代码中看到的那样soundCasual() …
instruments ×10
ios ×8
objective-c ×3
xcode ×3
nszombie ×2
automation ×1
breakpoints ×1
memory-leaks ×1
profiler ×1
profiling ×1
retaincount ×1
scnnode ×1
swift ×1
testing ×1
webkit ×1
xcode8 ×1