2011-03-11 2 views
-1

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

например.

someImage = image1.png 

someImage = image2.png 

Что происходит с изображением1.png с точки зрения памяти? Будет ли утечка при переназначении?

Изображения будут загружены из каталога документов.

+0

То, как вы просите, затрудняет понимание того, что вы действительно хотите знать. Этот код? Или псевдокод? Изображения не могут быть привязаны к изображениям. –

ответ

1

Это зависит от того, как загружаются изображения. Как и в случае с любыми другими объектами, если вы назначаете & init, вам нужно очистить себя. В противном случае вы можете полагаться на объекты с автореализацией.

Это не будет течь:

UIImage* someImage; 
someImage = [UIImage imageWithContentsOfFile:@"<path>/file1.png"]; 
// usage the image here ... 
someImage = [UIImage imageWithContentsOfFile:@"<path>/file2.png"]; 
// use the image again ... 

Это будет:

UIImage* someImage; 
someImage = [[UIImage alloc] initWithContentsOfFile:@"<path>/file1.png"]; 
// usage the image here … 
someImage = [[UIImage alloc] initWithContentsOfFile:@"<path>/file2.png"]; 
// use the image again ... 

Это действительно остается это просто до тех пор, как вы придерживаться классов какао - и вы, вероятно, не нужно блуждать в Carbon API больше. :)

0

Это зависит от того, как вы назначаете изображения.

Если вы что-то вроде

UIImage *someImage = [[UIImage alloc] initWithContentsOfFile:@"image1.png"]; 
... 
someImage = [[UIImage alloc] initWithContentsOfFile:@"image2.png"]; 

Там будет утечка памяти, потому что у вас есть право собственности на someImage и вы не отпуская ее.

Правильный способ сделать это:

UIImage *someImage = [[UIImage alloc] initWithContentsOfFile:@"image1.png"]; 
... 
[someImage release]; 
someImage = [[UIImage alloc] initWithContentsOfFile:@"image2.png"]; 
... 
[someImage release]; 

Или вы можете использовать autoreleased объекты

UIImage *someImage = [[[UIImage alloc] initWithContentsOfFile:@"image1.png"] autorelease]; 
... 
someImage = [[[UIImage alloc] initWithContentsOfFile:@"image2.png"] autorelease]; 
0

Другой способ - использовать @property с атрибутом «сохранить» (вместе с @synthesize). Но тогда вам нужно «отпустить» выделенный объект при назначении их:

@property (retain) UIImage *someImage; 
... 
@synthesize someImage; 
... 
self.someImage = givenImageg1; 
... 
self.someImage = givenImage2; 

Эта последняя строка выпустит установить первое изображение, а затем затем сохранить вторую. Обратите внимание, что вам нужно использовать «я». чтобы убедиться, что вы используете метод setter, который делает магию, иначе ничего не будет.

Смежные вопросы