2015-12-21 3 views
3

Когда я просматриваю UITableView, память продолжает увеличиваться, и я получаю такие результаты, когда запускаю «Allocations».VM: UITableViewLabel ест память iOS

Allocations Я вижу их, что VM: UITableViewLabel память продолжает расти и настойчив, Является ли их каким-либо образом я мог бы удалить это постоянное увеличение памяти

-(UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 

    { 
     NSString *text = @""; 
     BOOL defaultStyle = YES; 


    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (defaultCell == nil) { 
     defaultCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    else{ 
     NSLog(@"reusing the cell"); 
    } 

    defaultCell.textLabel.textAlignment = NSTextAlignmentLeft; 
    defaultCell.userInteractionEnabled = YES; 
    defaultCell.textLabel.font = [UIFont systemFontOfSize:26.0f]; 

    UIImageView *iv = defaultCell.imageView; 


    int totalSections = [self numberOfSectionsInTableView:tableView]; 
    NSInteger computedSection = indexPath.section; 

    if (defaultStyle) 
    { 
     defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue; 
     defaultCell.backgroundColor = [UIColor whiteColor]; 
     defaultCell.textLabel.textColor = [UIColor blackColor]; 
    } 

    else if (computedSection == 0) 
    { 
     const int totalRows = [self tableView:self.tableView numberOfRowsInSection:indexPath.section]; 
     if (indexPath.row == 0) { 
      text = @"Style1"; 
      defaultStyle = NO; 
      if (self.style1 == nil) 
      { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       defaultCell.textLabel.textColor = [UIColor grayColor]; 
      } 
      else 
      { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue; 
       defaultCell.textLabel.textColor = [UIColor blackColor]; 
      } 
      iv.image = [UIImage imageNamed: @"Style1.png"]; 

     } 

     if(indexPath.row == totalRows - 2){ 
      // Categories 
      text = @"Style2"; 
      iv.image = [UIImage imageNamed: @"Style2.png"]; 
      defaultStyle = NO; 

      if (self.style2 == nil) { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       defaultCell.textLabel.textColor = [UIColor grayColor]; 
      } else { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue; 
       defaultCell.textLabel.textColor = [UIColor blackColor]; 
      } 
     } 
     else if (indexPath.row == totalRows - 1){ 
      // Search 
      text = @"Style3"; 
      iv.image = [UIImage imageNamed: @"Style3.png"]; 
     } 

    } 
    else if (computedSection == 1) 
    { 

     MyCustomTableViewCell *cell = [mTableView dequeueReusableCellWithIdentifier:kCustomTableCellIdentifier]; 

     if (cell == nil) { 
      cell = [CustomTableViewCell loadFromNibNamed:@"CustomTableViewCell"]; 
     } 
     cell.titleLabel = @"custom cell"; 
     cell.openImage =[UIImage imageNamed: @"custom.png"] 
     return cell; 

    } 
    else if (indexPath.section == totalSections - 1) 
    { 

     if (indexPath.row == 0) 
     { 
      text = @"Account"; 
      defaultStyle = NO; 
      if (self.hasAccount == nil) 
      { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleNone; 
       defaultCell.textLabel.textColor = [UIColor grayColor]; 
      } 
      else 
      { 
       defaultCell.selectionStyle = UITableViewCellSelectionStyleBlue; 
       defaultCell.textLabel.textColor = [UIColor whiteColor]; 

      } 

      iv.image = [UIImage imageNamed: @"Account.png"]; 
     } 
    } 

    defaultCell.textLabel.text = text; 
    return defaultCell; 
} 
+0

добавил, что метод – hariszaman

+0

Не могли бы вы также отобразить заголовок класса ProgrammeTableViewCell и реализацию его метода 'dealloc'? – dasblinkenlight

+0

Что такое 'loadFromNibNamed:' метод, который вы используете для загрузки 'ProgrammeTableViewCell'?Если это просто обычная оболочка для 'loadNibNamed: owner: options:', она, скорее всего, написана для среды ARC, в то время как вы используете не-ARC, так что вы можете легко запутаться там с автореализацией. Также есть 'registerNib: forCellReuseIdentifier:' и 'dequeueReusableCellWithIdentifier: forIndexPath:', которые автоматически создают ячейку из NIB, если необходимо, и снимают бремя 'if (cell == nil)' проверок. И эй, почему не-ARC вообще? –

ответ

1

Я скопировал ваш код в новый проект и сделал несколько тестов. Он никогда не использовал более 10 Мб памяти на реальном устройстве, поэтому может быть 2 случая.

  1. Вызов метода, который протекает. На данный момент вы вызываете только один метод в cellForRow, потому что: BOOL defaultStyle = YES; Этот метод: int totalSections = [self numberOfSectionsInTableView:tableView]; Не могли бы вы также разместить этот метод?

  2. Подкласс UITableViewCell протекает при повторном использовании. Теперь это не вариант, так как вы используете UITableViewCell.

Небольшое примечание № 1: удалите авторекламу, если проект находится в ARC.

Небольшое замечание # 2: Используйте

static NSString *CellIdentifier = @"Cell"; UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; вместо:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (defaultCell == nil) { 
    defaultCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 
else{ 
    NSLog(@"reusing the cell"); 
} 

и вам не нужно, чтобы проверить и Alloc новые клетки вручную.

0

Я думаю, вы не повторно использовать клетки используется в вашем представлении таблицы

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
if (cell == nil) { 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"]; 
} else { 
    // reset your cell values here 
} 

Используйте это в вашей -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

+0

Я уже использую его, и я вижу его в журналах, что он повторно использует ячейку. – hariszaman

+0

Логическая переменная defaultStyle всегда ДА, когда она достигает условия if. Поэтому он всегда удовлетворяет условию if. Можете ли вы проверить, вызывает ли это какие-либо проблемы? – Arun

1

Спасибо всем за вашу помощь, следующее решение работал для меня

1.

-(void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kDefaultCellIdentifier]; 
    [self.tableView registerNib:[UINib nibWithNibName:@"CustomTableViewCell" bundle:nil] forCellReuseIdentifier:kCustomTableCellIdentifier]; 
} 

как сказал @ Петер Ковач

2.

Используется метод indexPath для обоих ячейки

static NSString *CellIdentifier = kDefaultCellIdentifier; 
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

static NSString *CellIdentifier = kCustomTableViewCellIdentifer; 
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

3.

Главная проблема, которую я использовал defaultCell глобально, он в defaultCell из очереди также для CustomTableViewCell, так и в случае CustomTableViewCell блок был вызван его из очереди на две ячейки. Деактивация соответствующей ячейки на основе их рядов решила проблему.

+0

Не очень элегантный, если вы принимаете мой ответ, то вы принимаете решение на основании моего ответа и принимаете свой собственный ответ вместо моего. : D Ofc, это не проблема, я рад, что смогу помочь. :) –

+0

ok признал ваш ответ тем, как ваш ответ не ответил на мою точную проблему, см. Третий пункт, который был моей проблемой – hariszaman

Смежные вопросы