Много странных утечек в инструментах только на устройстве (никаких утечек в симуляторе) - PullRequest
3 голосов
/ 23 декабря 2010

Я начал работать с инструментами и у меня много утечек. Я понятия не имею, как их решить.

Прибор показывает, что у меня есть утечка в этой строке:

NSArray *topLevelObjects = [[NSArray alloc] initWithArray:[[NSBundle mainBundle] loadNibNamed:@"SearchResultsTableViewCell" owner:self options:nil]];

Что с этим не так?

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"SearchResultsTableViewCell";

 SearchResultsTableViewCell *cell = (SearchResultsTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

 if (cell == nil) {
  NSArray *topLevelObjects = [[NSArray alloc] initWithArray:[[NSBundle mainBundle]
         loadNibNamed:@"SearchResultsTableViewCell"
         owner:self options:nil]];

  for (id currentObject in topLevelObjects) {
   if ([currentObject isKindOfClass:[UITableViewCell class]]) {
    cell = (SearchResultsTableViewCell *) currentObject;
    break;
   }
  }
  [topLevelObjects release], topLevelObjects = nil     ;
 }

    Product *product = [productMutableArray objectAtIndex:indexPath.row];

 cell.textLabel.text = product.title;
 cell.detailTextLabel.text = product.desc1;
 UIImageView *imageView = nil;
 if (product.photo == nil) {
  imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ph38x38.jpg"]];
 } else {
  imageView = [[UIImageView alloc] initWithImage:product.photo];
 }
 imageView.frame = CGRectMake(10., 3., 38., 38.);
 [cell addSubview:imageView];
 [imageView release];

    return cell;
}

У меня также есть много других утечек, но инструменты даже не показывают строку в коде, например, есть утечка: GenerlaBlock-64 - UIKit - GetContextStack Как я могу решить это? где мне его искать?

Я искал какие-то учебные пособия, но все они показывают только триальные примеры с retain count, alloc, release

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

Потоки не являются реальной проблемой. Это текстовое свойство UILabel.

cell.textLabel.text = product.title;
cell.detailTextLabel.text = product.desc1;

Это свойство может быть установлено только в главном потоке.

Вместо этого вызовите executeSelectorOnMainThread:

[cell.textLabel performSelectorOnMainThread:@selector(setText:) withObject:product.title waitUntilDone:NO];
[cell.detailTextLabel performSelectorOnMainThread:@selector(setText:) withObject:product.desc1 waitUntilDone:NO];
0 голосов
/ 29 декабря 2010

Темы были все проблемы.Я делал вилки все время, не возвращаясь в основной поток.Это была проблема.

0 голосов
/ 23 декабря 2010

Почему бы вам просто не удалить initWithArray: и не использовать

NSArray *topLevelObjects = [[NSBundle mainBundle]
         loadNibNamed:@"SearchResultsTableViewCell"
         owner:self options:nil];

(и вам нужно удалить release и установить nil строку тоже)

// РЕДАКТИРОВАТЬ: попробуйте установить owner:nil

...