#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
. Спасибо за совет, это пригодится.