Управление памятью с помощью свойств
-
06-07-2019 - |
Вопрос
Я начинаю лучше понимать управление памятью в Objective-C, но кое-что не понимаю.Это декларация о собственности:
@property (nonatomic, retain)UILabel *myLabel;
и это его невидимый синтезированный сеттер (я думаю):
- (void)setMyLabel:(UILabel *)newValue {
if(myLabel != newValue) {
[myLabel release];
myLabel = [newValue retain];
}
}
Это каждый раз избавляет вас от всей работы по сохранению и прочему, но, скажем, я установил свое свойство в первый раз, оно еще не было выделено, поэтому его счетчик ссылок равен 0, верно?Так что я делаю
UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];
Я не совсем уверен, что происходит, когда он ничего не освобождает, но предположим, что свойство уже имеет значение, и мы его устанавливаем.В установщике сначала он освобождается.Так разве это не приводит к его исчезновению?Если его счетчик ссылок равен единице, а затем в установщике он выпущен, как он останется, чтобы установить сохраненное новое значение?
Спасибо!!
Решение
Я думаю, вы путаете объекты и ссылки.Свойство — это ссылка на объект, а не сам объект.Когда вы устанавливаете или отменяете настройку свойства, оно сохраняет и освобождает объекты, на которые оно указывает, но сама ссылка является частью объекта, в котором находится свойство (в данном случае self).
Возможно, будет полезно почитать о таких вещах, как указатели и lзначения.
Другие советы
Начальное значение myLabel равно нулю, поэтому ваше первое присвоение свойству, т.е.
self.myLabel = tempLabel;
выпустит nil, т.е. [nil Release].В Objective C отправка сообщения в nil невозможна, поэтому это ничего не даст.
Аналогично, в вашем методе Dealloc у вас должно быть:
[myLabel release];
Это освободит myLabel, если свойство когда-либо было назначено, уравновешивая сохранение [newValue] в установщике.Если свойство никогда не было назначено, оно все равно будет равно нулю, и снова [nil Release] будет неактивным.
Прочтите правила управления памятью для получения точных правил о том, когда вам нужно сохранять/освобождать объекты.
Объект «исчезнет» (т. е. будет освобожден), когда все права на него будут переданы.То есть, когда (или вскоре после этого) все вызовы alloc/copy/new были сбалансированы вызовами Release/autorelease.
Я также относительно новичок в Objective-C, но хотел бы попытаться ответить на этот вопрос, чтобы подтвердить свое понимание.
скажем, я установил свое свойство впервые, оно еще не было выделено, поэтому его счетчик ссылок равен 0, верно?
Да, количество сохранений равно 0.
В установщике сначала он освобождается.Так разве это не приводит к его исчезновению?
Он вычитает 1 из счетчика сохранения myLabel
.Если счетчик сохранения myLabel достигает 0, данные или объект, myLabel
переменная, на которую указывает, будет освобождена из памяти.
Если его счетчик ссылок равен единице, а затем в установщике он выпущен, как он останется, чтобы установить сохраненное новое значение?
В этом сценарии данные myLabel
указывает, будет освобожден (счетчик сохранения будет равен 0) и myLabel
тогда будет указывать на ноль (оно пусто).Переменная устанавливается в классе и всегда будет доступна для приема сообщений этому установщику, поэтому новые данные можно назначить myLabel
ли myLabel
Счетчик сохранения равен 0 или 100.