Когда выпустить UIImage и ресурсы NSString - PullRequest
0 голосов
/ 31 марта 2011

Я пытаюсь получить правильное управление памятью, и в приведенном ниже коде, если я добавляю оператор последнего выпуска (для filePath), происходит сбой, и я не понимаю, почему.Я выделил его, так почему я не должен его выпускать?

Далее я возвращаю cellAbout к TableView.

Может кто-нибудь объяснить?

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
filePath = [filePath stringByAppendingString:@".png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
imageView.image = image;
[image release];
[filePath release];

Большое спасибо,

Крис.

Ответы [ 4 ]

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

[NSString stringByAppendingString] возвращает НОВУЮ строку, так что именно здесь вы вытекаете свою старую.

И тогда filePath больше не принадлежит вам, поэтому, если вы отпустите его позже, вы потерпите крах.

Вы можете обойти эту вещь вот так:

NSString *filePath = [NSString stringWithFormat:@"%@.png",self.gem.poiType];// don't release me.
1 голос
/ 31 марта 2011

Ваши вопросы

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];

Утечка filePath после этой строки.

filePath = [filePath stringByAppendingString:@".png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
imageView.image = image;
[image release];

Освобождение автоматически выпущенного объекта после этой строки.

[filePath release];

Вместо

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
NSString *extendedFilePath = [filePath stringByAppendingString:@".png"];
[filePath release];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: extendedFilePath];
imageView.image = image;
[image release];
1 голос
/ 31 марта 2011

Ответ заключается в том, что исходная строка filePath выделена и должна быть освобождена, но когда у вас есть строка:

  filePath = [filePath stringByAppendingString:@".png"];

, вы создаете другую строку - исходный указатель на filePath теперь исчез иэто утечка.

Вот код, который вы на самом деле хотите

 NSString *filePath = self.gem.poiType;
 filePath = [filePath stringByAppendingPathExtension:@"png"];
 UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
 imageView.image = image;
 [image release];

Так что вам не нужно освобождать filePath - он автоматически освобождается.Также у Apple есть специальный вызов для добавления расширений пути.

 NSString *filePath = [self.gem.poiType stringByAppendingPathExtension:@"png"];

на самом деле большинство людей пишут этот код - на одну строку меньше.

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

Вы просачиваетесь сюда и позже выпускаете автоматически выпущенную строку:

filePath = [filePath stringByAppendingString:@".png"];

Если вы действительно хотите отпустить вручную, сохраните указатель:

NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
NSString *somestring = [filePath stringByAppendingString:@".png"];
[filePath release];
...