0

Что произойдет, если autorelease удаляется от создания клеток вЧто произойдет, если UITableViewCell не будет выпущен?

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

STVCell *cell = (STVCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) { 
      cell = [[[STVCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 
} 

ответ

4

Это приведет к утечке памяти.

Поскольку вы звоните alloc, вы несете ответственность за также звонки release (или в этом случае autorelease).

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

+0

в этом случае, где бы я его вручную выпустил? –

+5

Нельзя безопасно разместить его вручную, поэтому вам необходимо использовать авторекламу. Вы не можете освободить его, прежде чем вы его вернете (потому что он будет освобожден до того, как ваш собеседник получит возможность его увидеть), и как только вы вернетесь, вы не сможете узнать, когда «безопасно» вызывать выпуск. (Не говоря уже о том, где вы могли бы сохранить ссылку, чтобы вы знали, что выпустить?) Эта ситуация именно то, что «автореклама» предназначена для: когда методу необходимо вернуть ссылку на выделенное хранилище и скоро его выпустить. Используйте autorelease. –

1

Ничего. И это плохо: клетка никогда не будет выпущена и станет утечкой памяти.

+0

В этом случае, где я его вручную выпустил? –

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