Я запустил профилировщик с параметрами выделения и утечки памяти.
Я обнаружил, что объект, связанный с ячейкой таблицы, никогда не освобождается.
Анализируя далее, я обнаружил, что проблема вызвана тем, что я сохраняю изображение в ячейке.
Я лучше объясню:
У меня есть объект, расширяющий ячейку таблицы:
@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"];
все ведет себя хорошо, и профилировщик не показывает ничего плохого, и объекты, в частности ячейка, освобождаются правильно.
На данный момент у меня есть два простых вопроса.
- почему это не отображается как утечка? Я имею в виду, профилирование с параметрами утечки не показывает это как утечка
- что я делаю не так с моим собственным изображением?
спасибо