освобождение объекта, созданного в геттере и сеттере - PullRequest
0 голосов
/ 30 сентября 2011

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

@property (nonatomic, retain) IBOutlet UITableView *myTable;

Нужно ли освобождать этот объект табличного представления в моем dealloc?Я создал этот просмотр таблицы, используя xib.

Спасибо.

Ответы [ 5 ]

1 голос
/ 30 сентября 2011

Так, скажем, документы :

Объекты в файле пера создаются с счетом сохранения 1 и затем автоматически высвобождаются.Однако при перестройке иерархии объектов UIKit восстанавливает соединения между объектами, используя метод setValue: forKey:, который использует доступный метод установки или сохраняет объект по умолчанию, если метод установки не доступен.Если вы определяете выходы для объектов nib-файла, вы всегда должны определять метод установки (или объявленное свойство) для доступа к этому выходу.Методы установки для торговых точек должны сохранять свои значения, а методы установки для торговых точек, содержащих объекты верхнего уровня, должны сохранять свои значения, чтобы предотвратить их освобождение.

И :

Когда появляется предупреждение о нехватке памяти, класс UIViewController очищает свои представления, если он знает, что может перезагрузить или воссоздать их позже.Если это происходит, он также вызывает метод viewDidUnload, чтобы дать вашему коду возможность отказаться от владения любыми объектами, связанными с вашей иерархией представления, включая объекты, загруженные с помощью файла nib, объекты, созданные в вашем методе viewDidLoad, и объекты, созданные навремя выполнения и добавлено в иерархию представлений.Как правило, если ваш контроллер представления содержит выходы (свойства или необработанные переменные, содержащие ключевое слово IBOutlet), вы должны использовать метод viewDidUnload, чтобы отказаться от владения этими выходами или любыми другими данными, относящимися к представлению, которые вам больше не нужны.*

Таким образом, при загрузке из NIB / XIB используется свойство.Это означает, что если вы указываете сохранить свойства в своих IBOutlets (что вам и нужно), вам нужно их освободить.Предпочтительный способ сделать это - viewDidUnload, используя свойство.

@property (nonatomic, retain) IBOutlet UITableView *myTable;

...

- (void) viewDidUnload
{
    self.myTable = nil;
}
1 голос
/ 30 сентября 2011

Прежде всего, вы ничего не сохраняете в файле .h.

Цель объявления @property в файле .h (его также можно указать в файле .m) - сообщить компилятору, как обрабатывать методы получения и установки этого свойства при использовании (синтаксис точки).).

Пример:

Объявление свойства следующим образом:

@property (nonatomic, retain) IBOutlet UITableView *myTable;

Сообщает компилятору, что при создании UITableView в файле .m, например, так:

- (id)initWithTable:(UITableView *)table
{
    self = [super init];
    if (self) {

        self.myTable = table;
    }
    return self;
}

Компилятор автоматически узнает о том, чтобы сохранить его, и поэтому вам также необходимо освободить его.

Но если вы объявите свое свойство следующим образом:

@property (nonatomic, assign) IBOutlet UITableView *myTable;

и создал tableView, как в предыдущем примере

- (id)initWithTable:(UITableView *)table
{
    self = [super init];
    if (self) {

        self.myTable = table;
    }
    return self;
}

Компилятор только присвоит значению myTable указатель на таблицу.Ты не будешь владеть им и не должен выпускать его.

1 голос
/ 30 сентября 2011

Да, вам нужно будет, как если бы вы создавали объект в файле .h и выделяли ему память. Единственное, что вы делаете в XIB - это создание связи между ними (XIB действует только как выходвнутренний просмотр таблицы), но если вы разместили кнопку с помощью xib и не связали ее с помощью кода, вам не нужно ее отпускать ...

0 голосов
/ 30 сентября 2011

это должен быть релиз. если вы хотите увидеть разницу, запустите ваше приложение на инструментах и ​​проверьте его.

0 голосов
/ 30 сентября 2011

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

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