Какао, почему я должен сохранить и выпустить параметр функции? - PullRequest
0 голосов
/ 18 мая 2009

Я работаю с книгой Аарона Хиллегаса, в частности, с примером лотереи. У меня был вопрос по поводу метода -setEntryDate:; почему я должен сохранить date? Программа по-прежнему работает без сохранения.

 -(void)setEntryDate:(NSCalendarDate *)date {
    [date retain];
    [entryDate release];
    entryDate = date;
}

Но это все еще прекрасно работает:

-(void)setEntryDate:(NSCalendarDate *)date {
    entryDate = date;
}

Так почему же мне нужно сохранить date и затем отпустить entryDate?

Ответы [ 4 ]

7 голосов
/ 18 мая 2009

Пока это работает, но если вы писали более крупную программу, есть вероятность, что в какой-то неопределенной точке в будущем объект, на который указывает date, будет выпущен тем, кто назвал setEntryDate. Если это произойдет, он будет признан недействительным на протяжении всей программы. Вы сохраняете этот объект в классе, потому что этот класс теперь владеет ссылкой на этот объект и должен указать это. Таким образом, даже если какой-либо класс с именем setEntryDate выпустит date, ваш класс все равно будет поддерживать действительную ссылку на него. Кроме того, это не просто обычный старый метод, который вы пишете. Это установщик, который несет особую ответственность за установку переменной экземпляра в классе, к которому он принадлежит. Если вы писали не установочный метод, вам может не потребоваться сохранять параметры. Я пытаюсь сказать, что сохранение параметров метода не всегда необходимо; это как раз в этом случае (и в значительной степени со всеми сеттерами, которые имеют дело с не примитивными типами).

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

3 голосов
/ 18 мая 2009

Поскольку вы заявляете право собственности на объект, и retain - это то, как вы это делаете. Иногда некорректный код будет работать правильно, но это просто удача.

См. Правила управления памятью какао .

1 голос
/ 18 мая 2009

Если вы научитесь лучше по видео, в Стэнфордском университете опубликовано некоторых видео о разработке для iPhone, которые также в определенной степени охватывают Какао и Objective-C. Прочтите лекцию 3, она дает хороший обзор по управлению памятью, с примерами и обсуждением.

1 голос
/ 18 мая 2009

Такие методы называются методами доступа . Они, как следует из названия, позволяют извлекать переменные и устанавливать - в частности, они называются «получателями» и «установщиками».

Соглашение (которое, однако, вы увидите в последующих главах книги, больше, чем соглашение) - вызывать «получатель» для переменной, например, NSString, называемое foo

- (NSString*)foo;

И «сеттер»:

- (void)setFoo:(NSString*)newFoo;

В приведенном выше примере реализован метод установки нового значения даты. Управление памятью описано в Главе 4, но вкратце способ работы объектов Objective-C заключается в том, что они имеют «счетчик сохранения» - это отражает число ссылок, которые имеет объект; при выделении объекты имеют счет сохранения 1. Объекты могут затем быть отправлены в сообщение retain или release для увеличения или уменьшения счетчика хранения соответственно. Сообщение retain подразумевает, что объект, отправляющий сообщение, хочет использовать объект, поэтому retain s его. Сообщение release подразумевает, что объект, отправляющий сообщение, больше не хочет использовать объект, следовательно, уменьшается счетчик сохраняемых данных. Когда счет сохранения объекта достигает 0, объект освобождается. Таким образом можно избежать утечек памяти.

Причина, по которой date сохраняется и entryDate освобождается, заключается в том, что date - это новый объект, о котором вы хотите «знать»; поэтому вы заявляете право собственности на него, * retain. Переменная entryDate указывает на текущий объект даты, но поскольку вы устанавливаете его как новое значение, вам больше не нужно знать об этом; поэтому вы release это; это предотвращает утечку памяти, поскольку вы изначально сохранили эту переменную.

Как я уже говорил, прочитав главу 4: Управление памятью , концепция станет намного более понятной. А пока просто примите это и поймите, почему это объясняется.

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