Обработка памяти при переназначении - PullRequest
0 голосов
/ 11 марта 2011

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

например.

someImage = image1.png

someImage = image2.png

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

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

Ответы [ 3 ]

1 голос
/ 11 марта 2011

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

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

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 голосов
/ 11 марта 2011

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

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

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

0 голосов
/ 11 марта 2011

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

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

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];

Или вы можете использовать автоматически выпущенные объекты

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