Objective-C: инициализация объекта и управление памятью - PullRequest
1 голос
/ 06 февраля 2010

Учитывая следующий фрагмент кода:

...

- (void) setTotalAmount: (NSNumber*)input
{
    [totalAmount autorelease];
    totalAmount = [input retain];
}

- (void) dealloc
{
    [totalAmount release];
    [super dealloc];
}

...

Что я хочу понять, насколько реально мы устанавливаем значение.Мы выделяем local (instance) var и «сохраняем» для ввода var.Но что такое «вход»?Это указатель на реальное значение?Или это самоценность?Когда мы «сохраняем», получаем ли мы указатель на «ввод» или указатель на значение или просто значение?

И почти такие же вопросы с dealloc и release.Что на самом деле «умирает» здесь?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

Понятно, что input - указатель. Вы объявили его тип в списке аргументов как NSNumber*.

input - указатель на объект типа NSNumber. Внутренне объект имеет целочисленную переменную, которая содержит количество внешних ссылок на него. Отправка сообщения retain объекту увеличивает его счетчик ссылок. Отправка сообщения release уменьшит счет. Отправка сообщения autorelease добавит объект в локальный пул автоматического выпуска, который будет отслеживать автоматически выпущенные объекты, и отправит им сообщение release в следующий раз, когда он опустошится. Объект со счетчиком ссылок 1, который получает сообщение release, будет освобожден, а его метод dealloc будет вызван. Вы должны освободить все имеющиеся у вас ресурсы, когда вас освободят.

Когда вы устанавливаете свойство, вы хотите освободить старое значение и убедиться, что новое значение сохраняется, пока сам объект жив. Чтобы убедиться, что новое значение сохраняется, вы увеличиваете его счетчик ссылок на 1, отправляя ему сообщение retain. Чтобы освободить старый объект, вы отправите ему сообщение об освобождении. Здесь есть одна тонкая проблема. Если старое значение совпадает с новым значением, если вы сначала высвободите старое значение, а его счетчик сохранения был равен 1, он будет уничтожен, прежде чем вы сможете увеличить его. Вот почему вы должны сохранить новое значение перед выпуском старого.

1 голос
/ 06 февраля 2010

Предполагая, что вы создали экземпляр объекта вышеупомянутого класса с именем "myObject", вы можете установить его totalAmount следующим образом:

...

// get a new NSNumber object which will be autoreleased
NSNumber *amount = [NSNumber numberWithInteger:10];

// call the setter which will autorelease the previous value of
// totalAmount (if any), retain the object referenced by "amount"
// (so that object will no longer be deallocated when it's autoreleased),
// and reference that object from the totalAmount instance variable
myObject.totalAmount = amount;

...

Позже, когда "myObject" освобожден, объект, на который ссылается переменная экземпляра totalAmount, будет освобожден (и освобожден, если он не был сохранен где-либо еще).

0 голосов
/ 06 февраля 2010

вводом является NSNumber

- (void) setTotalAmount: (NSNumber*)**input**

Который вызывается, делая что-то вроде этого:

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