NSScreen утечка под GarbageCollection, это ошибка - PullRequest
1 голос
/ 23 ноября 2010

Последние пару дней я пытался отлаживать утечки памяти в программе target-c и пытался найти какой-то очень простой пример кода, чтобы проверить некоторые идеи, и наткнулся на то, что мне кажется ошибкой.но я хотел бы получить мнения от тех, кто имеет больше знаний, когда дело доходит до разработки в мире Mac.

У меня есть следующий фрагмент кода:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSRect desktopRect = NSZeroRect;

NSArray* screens = [[NSScreen screens] autorelease];
int x = 0;
for (x = 0; x < [screens count]; x++)
{
    NSScreen *screen = [screens objectAtIndex:x];
}   

[pool drain];

Этот код живет внутри методачто я звоню из цикла while, который продолжается до тех пор, пока я не завершу процесс.(Помните, что это всего лишь простой тест.)

Когда я запускаю этот цикл и наблюдаю за распределением в инструментах, все отлично работает, когда я не реализую сборщик мусора.Мое общее количество выделений остается постоянным, и все с NSScreens очищается и освобождается.

Как только я включаю сборщик мусора, вызов [экранов NSScreen] начинает пропускать основные графические объекты, как сумасшедшие, никогда не освобождаяих.

Я видел на других форумах, где люди несколько лет назад говорили о том, что Core Graphics очень утечка из-за сборки мусора.Мне интересно, так ли это и здесь.

Есть какие-нибудь мысли от сообщества?

1 Ответ

1 голос
/ 23 ноября 2010

Хорошо, я собираюсь выйти на конечность и сказать, что да, это ошибка в части Apple, хотя я нашел решение с использованием некоторой магии Toll-Free-Bridging.Я изменил код так:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSRect desktopRect = NSZeroRect;

CFArrayRef screens = CFMakeCollectable((CFArrayRef)[NSScreen screens]);
int x = 0;
for (x = 0; x < [screens count]; x++)
{
    NSScreen *screen = (NSScreen*)CFArrayGetValueAtIndex(screens,x);
}   

[pool drain];

Вызывая CFMakeCollectable для массива с бесплатными мостами, он позволял правильно очищать фоновые графические объекты ядра при использовании сборки мусора.* Это определенно заставляет меня думать, что Apple нужно еще немного поработать с объектами Garbage Collection и Cocoa, которые обертывают Core Graphics.

...