Утечка памяти от UIImage в iOS - PullRequest
0 голосов
/ 24 мая 2011

У меня есть потенциальная проблема утечки памяти из объектов UIImage. Код как ниже. Пожалуйста, помогите.


UIImage *image = nil;

if (x == 0) {
    image = [UIImage imageWithCGImage:cg1];
} else {
    image = [UIImage imageWithCGImage:cg2];
}

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

[image release]; 

Я пытался освободить объект UIImage после блока if-else, но Xcode предупредил о «Неправильном уменьшении счетчика ссылок на объект, который в данный момент не принадлежит вызывающей стороне»,

Если я удаляю [релиз изображения], он показывает «Потенциальную утечку объекта, выделенного на линии ...».

Как решить проблему?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Проблема в том, что [UIImage new] совпадает с [[UIImage alloc] init], поэтому у вас уже есть сохраненный экземпляр.Затем вы выбрасываете указатель на экземпляр, вызывая [UIImage imageWithCGImage:], который возвращает автоматически выпущенный экземпляр, который вам не нужно сохранять!

Решение также выбрасывает [UIImage new] из вашего кодакак [image release] в конце.

0 голосов
/ 24 мая 2011
UIImage *image = nil;

if (x == 0) {
    image = [UIImage imageWithCGImage:cg1];
} else {
    image = [UIImage imageWithCGImage:cg2];
}

UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
// Some code
[imageView release];

Вы вступаете во владение объектом imageView, а не image. Так что вы должны выпустить imageView, а не image. Взгляните на Владение объектом в руководстве Apple по управлению памятью

0 голосов
/ 24 мая 2011

Вы выделяете новый экземпляр объекта UIImage с помощью метода new и присваиваете его переменной image.Затем вы немедленно вытекаете этот экземпляр, назначая другой экземпляр переменной, используя метод imageWithCGImage:.

Вам не нужно делать UIImage *image = [UIImage new]; в начале.Вы можете просто объявить свою переменную, не назначая ей экземпляров.Хорошей практикой было бы присвоить nil изначально.

Когда вы сделаете это, вам не нужно будет позднее освобождать объект изображения, потому что imageWithCGImage возвращает объект с автоматическим освобождением.

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