CGBitmapContextСоздать утечку памяти? - PullRequest
3 голосов
/ 13 августа 2011

Я не уверен, что понимаю, как освободить растровый контекст.

Я делаю следующее:

CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), kCGBitmapAlphaInfoMask);
.
. // (All straightforward code)
. 
CGContextRelease(context);

Xcode Analyze по-прежнему дает мне «потенциальную утечку памяти»в строке CGBitmapContextCreate.

Что я делаю не так?

Ответы [ 2 ]

7 голосов
/ 13 августа 2011

Поскольку вы не присваиваете результат CGColorSpaceCreateDeviceRGB () переменной, вы теряете ссылку на объект, созданный этим методом.
Эта ссылка понадобится вам позже, чтобы освободить объект цветового пространства. Core Graphics следует правилам управления памятью Core Foundation. Вы можете найти больше об этом здесь .

Исправлена ​​версия вашего кода:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask);
.
. // (All straightforward code)
. 
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

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

2 голосов
/ 13 августа 2011

Вы пропускаете объект цветового пространства из вызова CGColorSpaceCreateDeviceRGB(). Вам тоже нужно освободить цветовое пространство.

...