об управлении памятью на ios - PullRequest
0 голосов
/ 20 января 2012

здесь у меня есть tableView в моем viewController, и это так:

//.h
...
UITableView *aTable;
...
@property (nonatomic, retain) UITableView *aTable;
//.m
@synthesize aTable;
...
self.aTable = nil; // in viewDidUnload
[aTable release];  // in dealloc
...

и теперь в методе viewDidLoad мне нужно инициализировать этот talbe, поэтому я сделал это

// viewDidLoad
...
self.aTable = [[UITableView alloc] initWithFrame:xxxxx];
...

но когда я анализирую это, это напоминает мне, что в viewDidLoad,

там может быть потенциальная утечка памяти этого "aTable",

но я предполагаю, что собираюсь выпустить его в dealloc, так почему же все еще есть утечка памяти?

речь идет о свойстве "сохранить"?

Должен ли я добавить авторелиз к коду, в котором размещается и запускается этот tableView?

Большое спасибо!

1 Ответ

1 голос
/ 20 января 2012

Да, это должно быть (в среде без дуги):

self.aTable = [[[UITableView alloc] initWithFrame:xxxxx] autorelease];

Это дает вам автоматически освобожденный объект (количество записей: 0)

[[[UITableView alloc] initWithFrame:xxxxx] autorelease];

Это сохраняет таблицу(сохранить счет: 1), чтобы сохранить до viewDidUnload или до Dealloc

self.aTable = ...

Если вы не выполняете автоматический выпуск таблицы, вы получаете счет сохранения: 2 (один из alloc-init, а другой изсвойство retain), затем в ViewDidUnload с этой строкой self.aTable = nil; вы уменьшаете количество повторных вычислений до 1, но затем присваиваете nil своему ивару, так что вы теряете ссылку на живую таблицу, следовательно, происходит утечка tableView, затем вdealloc вы сделаете в основном это [nil release], которое не имеет никакого эффекта.

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