Проблема со спрайтовым листом - PullRequest
1 голос
/ 26 сентября 2011

Код ниже показывает, как я режу свои спрайты, но использование памяти постоянно растет.Как я могу исправить?

CGImageRef imgRef = [imgSprite CGImage];
[imgView setImage:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(imgRef, CGRectMake(column*width, line, width, height))]];
CGImageRelease(imgRef);

Этот код вызывается NSTimer с интервалом 0,1.

1 Ответ

2 голосов
/ 26 сентября 2011

Поскольку вы не опубликовали объявление 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, то вы владеете возвращаемым значением, поэтому вы должны освободить его, когда оно вам больше не нужно.

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