Неправильное размещение / освобождение объекта в target-c - PullRequest
1 голос
/ 27 февраля 2012

Я запустил профилировщик с параметрами выделения и утечки памяти. Я обнаружил, что объект, связанный с ячейкой таблицы, никогда не освобождается. Анализируя далее, я обнаружил, что проблема вызвана тем, что я сохраняю изображение в ячейке. Я лучше объясню:

У меня есть объект, расширяющий ячейку таблицы:

@interface IP2TableViewCell : UITableViewCell

@property(nonatomic,weak) IBOutlet UIImageView *background;
@property(nonatomic,weak) IBOutlet UIImageView *thumbnail;
@property(nonatomic,weak) IBOutlet UILabel *cellTitle;
@property(nonatomic,weak) IBOutlet UILabel *cellDescr;

@end 

просто @synthesize в файле класса .m и ничего больше.

Затем я создал класс, расширяющий UIImage, у которого есть этот соответствующий initMethod, который я использую. Я должен сказать, что self = [super ..] - это фрагмент кода. Я совершенно не понимаю, что я заимствую из автоматически сгенерированного кода для контроллеров представления, а это если (self = [super initWith ...)

-(ExtendedImage*)initWithPath:(NSString*)path andOptions:(NSDictionary*)opt {
   self=[super initWithContensOfFile:path];
   self.options=opt;
   return self;
}

это где проблема распределения начинает показывать. У меня есть фабрика, которая создает образ, вызывая метод init выше, а затем изображение добавляется в ячейку.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *obj = [fetchedResultsController objectAtIndexPath:indexPath];
    IP2TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"];
    cell.cellTitle.text=[obj objectForKey:@"cellTitle"];
    NSDictionary *options = [NSDictionary dictionaryWithObject:indexPath forKey:@"indexPath"];
    ExtendedImage *ei = [imageCache imageWithPath:@"/path/to/file" withOptions:options];
    cell.thumbnail.image=ei;
    return cell;
}

В профилировщике показано, что ExtendedImage живет вечно и никогда не освобождается, а также ячейка таблицы не освобождается. Если в другом случае я делаю

cell.thumbnail.image=[UIImage imageWithContentsOfFile:@"/path/to/file"];

все ведет себя хорошо, и профилировщик не показывает ничего плохого, и объекты, в частности ячейка, освобождаются правильно.

На данный момент у меня есть два простых вопроса.

  • почему это не отображается как утечка? Я имею в виду, профилирование с параметрами утечки не показывает это как утечка
  • что я делаю не так с моим собственным изображением?

спасибо

1 Ответ

1 голос
/ 27 февраля 2012

У вас есть imageCache: это говорит о том, что вы на самом деле пытаетесь кэшировать изображения. Это, по определению, приведет к тому, что они будут зависать, пока вы их не используете. Вы должны рассмотреть свою стратегию кэширования: вам действительно нужно кэшировать изображения вообще? Если так, то как долго? Когда вы можете очистить изображение из кэша?

Вы можете рассмотреть возможность использования очищаемой памяти (интеграция с NSCache ) для кеша, чтобы операционная система могла управлять выбрасыванием ваших изображений, когда они мешают.

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