Управление памятью Objective-C: что происходит при установке свойства сохранения? - PullRequest
0 голосов
/ 25 августа 2011

Я бы хотел понять последствия управления памятью следующей строки кода:

// in tableView:cellForRowAtIndexPath
cell.accessoryView = [[UIImageView alloc] initWithImage:
                      [UIImage imageNamed:@"test.png"];

Я звоню alloc, что обычно означает, что я звоню release куда-нибудь. Свойство UITableViewCell accessoryView setter имеет значение retain, поэтому (я думаю) ячейка будет "вступать во владение" UIImageView. Что именно происходит в приведенной выше строке кода в отношении управления памятью?

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Если вы не отпустите вид где-то, то он будет пропущен. Так что вы можете сделать

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"];
cell.accessoryView = imageView;
[imageView release];

или вы также можете сделать

cell.accessoryView = [[[UIImageView alloc] initWithImage:
                  [UIImage imageNamed:@"test.png"] autorelease];
2 голосов
/ 25 августа 2011

Первое: + alloc сохраняет UIImageView (или, альтернативно, «вы начинаете с владения UIImageView»)

Второй: + imageNamed автоматически высвобождает UIImage (или, "+ imageNamed не дает права владения UIImage")

В-третьих: установщик для accessoryView сохраняет UIImageView (или «вспомогательный вид становится владельцем UIImageView»)

Поскольку теперь у вас есть два владельца для UIImageView, это, вероятно, утечка, если вы не намеренно оставляете его для последующего использования и соответственно управляете им.

1 голос
/ 25 августа 2011

Думайте об этом так: вы вызываете alloc / init, так что вам это принадлежит. Вы должны освободить его, когда вы больше не хотите владеть им.

Можно предположить, что cell.accessoryView становится владельцем, если в документах не указано иное (как в случае с делегатами), поэтому, как только вы назначите его для cell.accessoryView, вам, вероятно, больше не нужно будет владеть им. Вы должны выпустить это.

В итоге, эта строка сохраняется как минимум дважды: один раз с помощью alloc / init и как минимум один раз с присваиванием cell.accessoryView. Вы несете ответственность только за один выпуск, один за alloc / init.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...