Вопрос

Я начинаю лучше понимать управление памятью в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top