Закрытие и повторное открытие окна утечки памяти

#objective-c #cocoa #memory-leaks

#objective-c #cocoa #утечки памяти

Вопрос:

Здесь проблема. Я создаю MAAttachedWindow , затем скрываю его, когда происходит определенное событие. Вот как выглядит код:

 -(void)toggleDetailShouldShow:(BOOL)show {
    if (show) {
        if (!attachedWindow) {
            NSPoint buttonPoint = NSMakePoint(NSMidX([[someView someImageView] frame]),
                                              NSMidY([[someView someImageView] frame]));
            attachedWindow = [[MAAttachedWindow alloc] initWithView:view 
                                                    attachedToPoint:buttonPoint 
                                                           inWindow:window 
                                                             onSide:12
                                                         atDistance:65.0];
            //setup here
            [attachedWindow setAlphaValue:0.0];
            [[[someView someImageView] window] addChildWindow:attachedWindow ordered:NSWindowAbove];
            [[attachedWindow animator] setAlphaValue:1.0];
        } 
    }
    else {
        if (attachedWindow) {
            [[[someView someImageView] window] removeChildWindow:attachedWindow];
            [attachedWindow orderOut:self];
            [attachedWindow release];
            attachedWindow = nil;            
        }
    }
}
  

Когда это срабатывает несколько раз, использование моей памяти неуклонно растет. Есть ли причина, по которой происходит утечка?

Комментарии:

1. Что конкретно происходит с утечкой? MAAttachedWindow?

2. Ну, это то, что я предполагаю. Инструменты вообще не показывают утечки, и вот тут я сталкиваюсь с проблемой. Это единственный код, который я запускал, когда объем памяти продолжал увеличиваться. Вот почему я решил, что утечка произошла именно в этом окне.

3. Только частично связано, но могу ли я предложить свой класс SFBPopoverWindow- github.com/sbooth/SFBPopovers — это похоже на MAAttachedWindow, но с немного другой функциональностью

4. @sbooth: Я почти решил использовать ваш код, но, к сожалению, обнаружение краев экрана было довольно слабым по сравнению с MAAttachedWindow. Честно говоря, это будет отображаться неправильно, даже если установлено автоматическое.

5. @sbooth: На самом деле, я только что посмотрел на это снова, и я неправильно его настраивал. Переключился на ваш код и не оглядывался назад. Спасибо, что поделились своим потрясающим классом!

Ответ №1:

Это идеальная ситуация для использования анализа Heapshot.

Симптомы, которые вы описываете, точно такие же, как симптомы, которые я видел в Hex Fiend при написании этой статьи.

Скорее всего, утечка чего бы то ни было — а это действительно утечка, поскольку ваше приложение наращивает объем памяти — все еще связана с остальной частью графа объектов приложения.

Комментарии:

1. Что ж, похоже, что утечка происходит из-за кода Мэтта Геммелла для MAAttachedWindow . Спасибо за совет, это пригодится.