[NSWindowController window] сохранение окна, когда NSWindowController инициализируется с окном? - PullRequest
2 голосов
/ 13 июня 2011

В приложении (OS X 10.6.7) у меня есть подкласс NSWindowController, который инициализируется с -[NSWindowController initWithWindow:], т.е. я уже создал окно в коде; Я не загружаю его из пера.

Обычно я обращаюсь к окну в моих NSWindowController подклассах с [self window]. Но в этом случае, каждый раз, когда я отправляю [self window], окно сохраняется, поэтому я получаю довольно много утечек.

Это предполагаемое поведение? На данный момент я обошел это, просто сохранив окно в переменной экземпляра в методе init и никогда не отправляя [self window].

Я почти уверен, что этого не происходит, потому что NSWindowController пытается загрузить окно: -loadWindow не сохраняет окно и -isWindowLoaded возвращает YES:

(gdb) set $window = (id)[self window]
Current language:  auto; currently objective-c
(gdb) p (int)[$window retainCount]
$1 = 3
(gdb) p (BOOL)[self isWindowLoaded]
$2 = 1 '\001'
(gdb) call (void)[self loadWindow]
(gdb) p (int)[$window retainCount]
$3 = 3
(gdb) p (int)[[self window] retainCount]
$4 = 4
(gdb) p (int)[[self window] retainCount]
$5 = 5

1 Ответ

2 голосов
/ 13 июня 2011

-[NSWindowController window] сохранение окна в порядке;Кажется, проблема связана с пулами автоматического выпуска.

window = [[NSWindow alloc] initWithContentRect:NSMakeRect(100, 100, 200, 200)
                                               styleMask:NSTitledWindowMask
                                                 backing:NSBackingStoreBuffered
                                                   defer:NO];
NSWindowController *controller = [[NSWindowController alloc] initWithWindow:window];
[window setTitle:@"testing"];
[window makeKeyAndOrderFront:nil];
[window release];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[controller window];
[controller window];
[controller window];
NSLog(@"[window retainCount]: %d", [window retainCount]);
[pool drain];
NSLog(@"[window retainCount]: %d", [window retainCount]);

Вывод:

2011-06-12 19:26:52.337 window[5517:a0b] [window retainCount]: 1
2011-06-12 19:26:52.339 window[5517:a0b] [window retainCount]: 4
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 7
2011-06-12 19:26:52.340 window[5517:a0b] [window retainCount]: 4

Проблема заключалась в том, что я забыл создать пул, когда выполнял какао в событии Carbonобработчик (InstallApplicationEventHandler).Это соответствует контексту потока, с которым я связан.

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

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