Cocoa 更正NSView内存泄漏

Cocoa 更正NSView内存泄漏,cocoa,memory-leaks,drag-and-drop,nsview,Cocoa,Memory Leaks,Drag And Drop,Nsview,我需要一些帮助来了解是什么导致我的应用程序泄漏。应用程序使用ARC。我在窗口上有一个NSView,用作文件的放置区。当您将一个文件拖到窗口上时,我会选择在应用程序的其他方面使用的路径和文件名 当我通过仪器运行应用程序时,一旦启动应用程序,就会出现内存泄漏。以下是指向仪器中返回内容的快照的链接: 下面是我的自定义类(dropZone)的拖放代码 我需要一个教训。我不知道如何读取仪器返回的数据进行校正 谢谢你的帮助 @implementation dropZone - (id)initWith

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

当我通过仪器运行应用程序时,一旦启动应用程序,就会出现内存泄漏。以下是指向仪器中返回内容的快照的链接:

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

我需要一个教训。我不知道如何读取仪器返回的数据进行校正

谢谢你的帮助

@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
@实现dropZone
-(id)initWithFrame:(NSRect)帧{
self=[super initWithFrame:frame];
如果(自我){
//这里是初始化代码。
[self-RegisterOrdRaggedTypes:[NSArray arrayWithObjects:NSFileNamesPardType,nil]];
}
回归自我;
}
-(void)drawRect:(NSRect)dirtyRect{
/*NSRect界限=[自界限];
[[NSColor grayColor]集];
[NSBezierPath fillRect:bounds]*/
}
-(NSDragOperation)DragginGeted:(id)发送方{
NSPasteboard*pboard;
NSDRAGO操作源DRAGMASK;
sourceDragMask=[sender DragingSourceOperationMask];
pboard=[发送方拖动粘贴板];
if([[pboard types]包含对象:NSFilenamesPboardType]){
if(sourceDragMask和NSDragOperationLink){
返回NSDragOperationLink;
}else if(源DragMask和NSDragOperationCopy){
返回NSDRAGO操作副本;
}
}
返回nsdragooperationne;
}
-(BOOL)performDragOperation:(id)发送方
{
NSPasteboard*pboard=[发送方拖动粘贴板];
if([[pboard types]包含对象:NSFilenamesPboardType]){
NSArray*文件=[pboard propertyListForType:NSFilenamesPboardType];
//使用文件列表执行操作
NSLog(@“拖动文件”);
int i;
对于(i=0;i<[文件计数];i++){
NSLog(@“%@,[files objectAtIndex:i]);
NSString*new=[files objectAtIndex:i];
[[NSApp delegate]updateText:new];
}
}
返回YES;
}
@结束

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

你从来都不关心一次性泄漏,比如438字节。您只关心持续的泄漏

要找到这些,你可以像平常一样在Instruments下启动你的应用程序,但一旦一切都稳定下来,你就可以在Instruments中对其进行快照(比如,进行一次完整的拖放,然后进行快照)

然后在快照之后再拖放一些,然后查看是否存在泄漏。这些是唯一重要的。(除非,比如,你在发射时不知何故泄漏了500MB,而事实并非如此。)


Wil,非常有用。愚蠢的我没有意识到这些罕见的一次性泄漏在发射时(除非相当大)真的没有关系。当我放下NSOpenPanel时,还有另一个问题。同样的症状。我猜没什么好担心的吧?我需要进一步教育自己。我很沮丧,我真的不知道我在看什么仪器。我会四处寻找资源,当然也会查看支持文档。我花了几年时间才完全熟悉仪器,其中一部分时间是看到创作者在WWDC使用它。我仍然觉得自己不是一个专家,但它仍然是一个非常强大的工具。看看你能不能在上面找到WWDC的视频,它们真的很有帮助。是的,忽略OpenPanel的微小泄漏。