【问题标题】:Correcting NSView Memory Leak纠正 NSView 内存泄漏
【发布时间】:2014-01-27 22:09:33
【问题描述】:

我需要一些帮助来了解导致我的应用程序泄漏的原因。应用程序使用 ARC。我在一个窗口上有一个 NSView,用作文件的放置区。当您将文件拖到窗口上时,我会选择路径和文件名以在应用程序的其他方面使用。

当我通过 Instruments 运行应用程序时,一启动应用程序就会出现内存泄漏。下面是 Instruments 中返回的快照的链接:

http://f-video.s3.amazonaws.com/leak.jpg

下面是我的自定义类 (dropZone) 的拖放代码。

我需要这方面的教训。我不明白如何读取 Instruments 中返回的数据以进行更正。

感谢您的帮助。

@implementation dropZone


- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
    // Initialization code here.
    [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];

}
return self;
}

- (void)drawRect:(NSRect)dirtyRect {
/*NSRect bounds = [self bounds];
[[NSColor grayColor] set];
[NSBezierPath fillRect:bounds];*/
}

- (NSDragOperation)draggingEntered:(id )sender {
NSPasteboard *pboard;
NSDragOperation sourceDragMask;

sourceDragMask = [sender draggingSourceOperationMask];
pboard = [sender draggingPasteboard];

if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
    if (sourceDragMask & NSDragOperationLink) {
        return NSDragOperationLink;
    } else if (sourceDragMask & NSDragOperationCopy) {
        return NSDragOperationCopy;
    }
}
return NSDragOperationNone;
}

- (BOOL)performDragOperation:(id )sender
{
NSPasteboard *pboard = [sender draggingPasteboard];

if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
    NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
    // Perform operation using the list of files
    NSLog(@"Dragged files");
    int i;
    for (i = 0; i < [files count]; i++) {


        NSLog(@"%@",[files objectAtIndex:i]);




        NSString * new = [files objectAtIndex:i];
        [[NSApp delegate] updateText:new];
    }



}
return YES;
}


@end

【问题讨论】:

    标签: cocoa memory-leaks drag-and-drop nsview


    【解决方案1】:

    通常,当您使用 Instruments 时,您必须了解在启动时系统中经常会出现一次性泄漏。

    您永远不会关心一次性泄漏,例如 438 字节。您只关心持续的泄漏。

    要找到这些,您可以像往常一样在 Instruments 下启动您的应用,然后在一切稳定后在 Instruments 中快照它(例如,执行一次完整的拖放操作,然后进行快照)。

    然后在快照之后再拖放一些,然后看看是否有泄漏。这些是唯一重要的。 (除非你在发布时以某种方式泄漏了 500MB,但事实并非如此。)

    【讨论】:

    • 威尔,很有帮助。愚蠢的我没有意识到发布时那些罕见的一次性泄漏(除非相当大)真的无关紧要。当我放下一个 NSOpenPanel 时,还有另一个。相同的症状。我想这没什么好担心的吧?我需要进一步教育自己。我很沮丧,我真的不知道我在 Instruments 中看到的是什么。我会四处寻找资源,当然还要查看支持文档。
    • 我花了几年时间才完全熟悉 Instruments,其中一部分原因是看到创作者在 WWDC 上使用它。我仍然不觉得自己是专家,但它是如此强大的工具,不过如此。看看你能不能找到上面的 WWDC 视频,它们真的很有帮助。是的,忽略 OpenPanel 的微小泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多