2014-01-27 4 views
0

Мне нужна помощь, чтобы понять, что вызывает утечку в моем приложении. Приложение использует ARC. У меня есть NSView в окне, функционирующем как зона перетаскивания для файлов. Когда вы перетаскиваете файл в окно, я выбираю путь и имя файла для использования в других аспектах приложения.Исправление утечки памяти NSView

Когда я запускаю приложение через Инструменты, происходит утечка памяти, как только я запускаю приложение. Вот ссылка на снимок того, что возвращается в инструментах:

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

Ниже Перетаскивание код для моего пользовательского класса (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 

ответ

2

Обычно, когда вы используете инструменты, вы должны понимать, часто будут утечками единовременной в системе при запуске.

Вам никогда не нужна единовременная утечка, например, 438 байт. Вы заботитесь о непрерывных утечках.

Чтобы найти их, вы запускаете свое приложение под Инструменты как обычно, но затем вы получаете моментальный снимок в Инструментах, как только вы получите все стабильное (например, сделайте полное перетаскивание, ТОГДА снимок).

Затем вы перетаскиваете еще немного после моментального снимка и смотрите, есть ли утечки ТОГДА. Это единственные, что имеет значение. (Если, как, вы как-то протекает, как 500MB на старте, что вы не являетесь.)

enter image description here

+0

Виль, очень полезно. Глупый из меня, чтобы не осознавать, что те редкие однократные утечки при запуске (если только они не значимы) действительно не имеют значения. Есть и другое, когда я бросаю NSOpenPanel. Те же симптомы. Я предполагаю, что не о чем беспокоиться? Мне нужно еще больше обучиться. Я расстроен тем, что я действительно понятия не имею, что я рассматриваю в «Инструментах». Я посмотрю на ресурс и, конечно же, проверю документы поддержки. – Paul

+0

Мне потребовались годы, чтобы познакомиться с инструментами, и часть его видна тем, что создатели используют его на WWDC. Я все еще не чувствую себя экспертом, но это такой мощный инструмент, тем не менее. Посмотрите, сможете ли вы найти на нем видео WWDC, они действительно помогают. Да, игнорируйте крошечные утечки OpenPanel. –

Смежные вопросы