Поскольку вы не опубликовали объявление imgSprite
, я буду считать, что его класс соответствует соглашениям по именованию Какао.
В:
CGImageRef imgRef = [imgSprite CGImage];
этот метод (не-NARC 1 метод) возвращает объект, которым вы не владеете , следовательно, вы не должны освобождать его.
In:
[imgView setImage:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))]];
аргументом является выражение:
CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))
CGImageCreateWithImageInRect()
(функция, имя которой следует правилу создания 2 ) возвращает изображение, которое вы делаете принадлежит, следовательно, вы должны выпустить его, а вы этого не сделаете.
In:
CGImageRelease(imgRef);
вы выпускаете изображение, которое вы не не владеет, поэтому вы не должны выпустить его.
У вас есть две проблемы: вы (потенциально более) выпускаете imgRef
и вы пропускаете изображениевозвращается CGImageCreateWithImageInRect()
.
Вместо этого вы должны сделать следующее:
// you do not own imgRef, hence you shouldn’t release it
CGImageRef imgRef = [imgSprite CGImage];
// use a variable for the return value of CGImageCreateWithImageInRect()
// because you own the return value, hence you should release it later
CGImageRef imgInRect = CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height));
[imgView setImage:[UIImage imageWithCGImage:imgInRect]];
CGImageRelease(imgInRect);
Возможно, вы захотите прочитать Руководство по программированию управления памятью и ПамятьПрограмма управленияg Руководство по базовому фундаменту .
1 NARC = новое, выделение, сохранение, копирование
2 Правило создания гласит, что если вы вызываете функцию, имя которой содержит Create или Copy, то вы владеете возвращаемым значением, поэтому вы должны освободить его, когда оно вам больше не нужно.