2013-11-28 1 views
0

У меня есть два tableviewcell в файле xib, и я использую их оба.Память warrning tableviewcell

Когда я использую один из них, память по-прежнему составляет 7,3 МБ, но когда я использую обе памяти, они растут очень быстро.

Пожалуйста, помогите мне. Я не сейчас, что не так.

Мой код ниже:

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

    NSUInteger row = [indexPath row]; 
    NSDictionary *rowData = [self.events objectAtIndex:row]; 

    static NSString *CellIdentifierL = @"LeftCell"; 
    static NSString *CellIdentifierR = @"RightCell"; 


    SampleTableCell *cellLeft = [tableView dequeueReusableCellWithIdentifier:CellIdentifierL]; 
    SampleTableCell *cellRight = [tableView dequeueReusableCellWithIdentifier:CellIdentifierR]; 

    if (cellLeft == nil) { 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"LeftTableCell" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[SampleTableCell class]]) { 
       cellLeft = (SampleTableCell *)currentObject; 
       break; 
      } 
     } 
    } 

    if (cellRight == nil) { 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RightTableCell" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[SampleTableCell class]]) { 
       cellRight = (SampleTableCell *)currentObject; 
       break; 
      } 
     } 
    } 



    return (row%2==0)?cellRight:cellLeft; 
} 
+0

Вы проверили свой отчет о сбое памяти или журнал интрументов, потому что ваш код выглядит прекрасным, что вы делаете с ячейкой, есть еще несколько вещей, которые у вас остались? Думаю, – Retro

+0

Я не вижу проблемы в этом фрагменте кода. Когда растет площадь памяти? Прокручивая представление таблицы? –

+0

Две теории: 1- Вы уверены, что ваш 'SampleTableCell' имеет правильный reusableCellIdentifier? (проверьте, что в вашем xib) Если нет, это означает, что вы создаете слишком много строк. 2- Вы должны определить, какую ячейку вы должны создать, прежде чем создавать их. Однако это имеет значение только для первых творений клеток. –

ответ

0

Это не очень хороший способ сделать это. Вы создаете обе ячейки для каждой строки, но используете только один из них. Вы также должны использовать более новый способ использования ячейки на основе xib, то есть использовать registerNib: forCellWithReuseIdentifier: in viewDidLoad, чтобы зарегистрировать оба ножа. Сначала сделайте свой чек для нечетных/четных строк и вычеркните правильную ячейку (нет необходимости проверять нуль при использовании метода register). Вы делаете это так:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerNib:[UINib nibWithNibName:@"SampleCell1" bundle:nil] forCellReuseIdentifier:@"SampleCell1"]; 
    [self.tableView registerNib:[UINib nibWithNibName:@"SampleCell2" bundle:nil] forCellReuseIdentifier:@"SampleCell2"]; 

} 


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

    if (indexPath.row % 2 == 0) { 
     SampleCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell1" forIndexPath:indexPath]; 
     // populate cell with data 
     return cell; 
    }else{ 
     SampleCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell2" forIndexPath:indexPath]; 
     // populate cell with data 
     return cell; 
    } 
} 

Это все, что вам нужно сделать. Нет необходимости проверять ячейку nil, потому что dequeueReusableCellWithIdentifier: forIndexPath: гарантированно вернет действительную ячейку, если вы либо зарегистрируете нить, либо сделаете ячейку в раскадровке (в этом случае вам не нужно ничего регистрировать).

+0

У вас есть пример? Должен ли я создать в viewDidLoad в моем контроллере? И как я могу использовать его в cellForRowAtIndex – Unmerciful

+0

Создание обеих ячеек не должно быть проблемой. ARC должен немедленно освободить неиспользуемую ячейку, когда метод вернется. Хотя интересный вопрос заключается в том, настраивать ли себя, когда владелец nib противодействует ARC в этом случае. Можете ли вы попробовать это без использования владельца: self in loadNibNamed :? –

+0

@ Умеренный, я обновил свой ответ, чтобы показать вам, как это сделать. В этом примере я создал класс, SampleCell и два xib-файла SampleCell1 и SampleCell2. – rdelmar

0

Вам необходимо создать только те ячейки, которые вам нужны. Ваш код должен быть таким:

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

    NSUInteger row = [indexPath row]; 
    NSDictionary *rowData = [self.events objectAtIndex:row]; 

    static NSString *CellIdentifierL = @"LeftCell"; 
    static NSString *CellIdentifierR = @"RightCell"; 

    if (cellLeft == nil) { 
     SampleTableCell *cellLeft = [tableView dequeueReusableCellWithIdentifier:CellIdentifierL]; 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"LeftTableCell" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[SampleTableCell class]]) { 
       cellLeft = (SampleTableCell *)currentObject; 
       break; 
      } 
     } 
     return cellLeft; 
    } 

    if (cellRight == nil) { 
     SampleTableCell *cellRight = [tableView dequeueReusableCellWithIdentifier:CellIdentifierR]; 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RightTableCell" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[SampleTableCell class]]) { 
       cellRight = (SampleTableCell *)currentObject; 
       break; 
      } 
     } 
     return cellRight; 
    } 



    return nil; 
} 
0

меняю на это:

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

    NSUInteger row = [indexPath row]; 
    NSDictionary *rowData = [self.events objectAtIndex:row]; 

    SampleTableCell *cell; 


    if(row%2==0){ 

     cell = [[[NSBundle mainBundle] loadNibNamed:@"RightTableCell" owner:self options:nil]objectAtIndex:0]; 

    }else{ 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"LeftTableCell" owner:self options:nil]objectAtIndex:0]; 
    } 

    cell.labelName.text = [rowData objectForKey:@"name"]; 

    return cell; 
} 

Но я не знаю, что это хорошая идея?

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