Должен ли быть опубликован результат CGImageGetColorSpace (изображение)? - PullRequest
9 голосов
/ 11 марта 2011

Я масштабирую CGImageRef.В Интернете я нашел несколько примеров кода, которые начинаются так:

CGColorSpaceRef colorspace = CGImageGetColorSpace(image); // "Get" color space

CGContextRef context = CGBitmapContextCreate(NULL, width, height,
    CGImageGetBitsPerComponent(image),
    CGImageGetBytesPerRow(image),
    colorspace,
    CGImageGetAlphaInfo(image));

CGColorSpaceRelease(colorspace); // Really?

Как вы можете видеть выше, colorspace выпущен.Однако, когда я делаю это, мой код работает большую часть времени, но время от времени вылетает, потому что иногда этот экземпляр цветового пространства уже пропадает.Документы API говорят:

Вы несете ответственность за сохранение и освобождение цветового пространства по мере необходимости.

Означает ли это, что я должен отпустить?Я предполагал, что соглашение состоит в том, что только результаты вызовов с "Create" в имени возвращают объекты, которые должны быть явно освобождены.Означает ли это, что примеры в Интернете просто неверны при выпуске этого CGColorSpaceRef?

Ответы [ 5 ]

10 голосов
/ 11 марта 2011

Как сказано в документации API, вы несете ответственность за сохранение и освобождение цветового пространства по мере необходимости. То есть если вам нужно, сохраните его. Если ты не сохранишь, не отпускай. Подробнее об этом здесь

3 голосов
/ 23 февраля 2014

Правило управления временем жизни объектов CoreFoundation и другими подобными им объектами, например, объектами CoreGraphic, заключается в том, что если вы получили объект, используя функцию с именем Create или Copy, то вам нужно использовать соответствующий выпуск метод, когда вы закончили с объектом.

Так как код в исходном вопросе показывает, что объект CoreGraphics был получен с использованием метода с Get в его имени, а не Create или Copy, то вы НЕ должны освобождать объект после его использования. Если вы выпустите релиз, вы должны ожидать аварий.

3 голосов
/ 30 июля 2012

Та же самая проблема случалась со мной. Я обнаружил, что в моем случае проблема заключалась в выпуске следующего ColorSpace:

CGColorSpaceRef colorSpace = CGImageGetColorSpace(pic.CGImage);

После того, как я изменил эту строку на:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

все работало как раньше, кроме ошибки :)

3 голосов
/ 14 февраля 2012

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

У нас есть приложение, которое считывало поля из цветового пространства каждого растрового изображения, с которым оно имело дело, и вызывало бы [UIImage imageName], затем CGImageGetColorSpace и CGColorSpaceRelease.И в определенном сценарии, он будет делать это несколько раз подряд для одного и того же изображения.Недетерминированное, это иногда приводило бы к сбою со следующей ошибкой во время CGColorSpaceRelease:

Assertion failed: (!state->is_singleton), function color_space_state_dealloc, file ColorSpaces/CGColorSpace.c, line 127.

Это было на iOS5 как на ipad, так и на симе.

Я знаю, это худшеевроде сообщения об ошибке, но, эй, если вы столкнетесь с той же проблемой и начнете вытягивать волосы (мы это сделали), то, возможно, это может служить подтверждением того, что вы не единственный, кто когда-либо сталкивался с таким поведением.

Эта ошибка: «случайный сбой при выполнении тестов на соответствие WebGL» похоже, что это может быть той же проблемой.Или этот .

Наш обходной путь - прекратить чтение данных цветового пространства.Все еще не совсем уверен, что происходит не так.Извините, если бы я мог дать больше информации

--- Дэйв

пс, http://xkcd.com/979/, и извините за пост "здесь будут драконы".:)

1 голос
/ 06 сентября 2014

Да, вы должны.

Возвращенный CGColorSpaceRef из CGImageGetColorSpace не сохраняется, как следует из его «Get» в названии. И это ваш звонок, вы тогда позвоните CGColorSpaceRetain(colorSpace) или нет.

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

Если вам нужно передать какой-либо объект CG другим функциям, всегда проверяйте, сохранен ли он. Всегда.

...