сохранить объект в target-c

Я делаю метод набора:

OBS: somobject — это атрибут класса.

– (void)setSomeObject:(SomeObject *)newSomeobject {

    [someobject autorelease];

    someobject = [newSomeobject retain];

    return;

}

on [somobject autorelease] я заявляю, что больше не хочу владеть объектом в рамках setSomeObject.

Будет ли освобожден «какой-то объект», сохраненный другим объектом? Или объект будет освобожден только методом setSomeObject?

Если атрибут класса someobject уже существует?

Каково будет поведение этого объекта?


person okami    schedule 10.03.2010    source источник


Ответы (3)


Я бы переименовал параметр в методе, чтобы он отличался от ivar:

– (void)setSomeObject:(SomeObject *)newObject 
{
    [someobject autorelease];

    someobject = [newObject retain];
}

Также вам следует прочитать документы Apple по управлению памятью и @property и @synthesize.

person Benedict Cohen    schedule 10.03.2010

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

Если у вас проблемы с управлением памятью, ознакомьтесь с руководством по программированию Apple.

person Community    schedule 10.03.2010
comment
Хорошо, я прочитал это и понял. Спасибо. SomeObject будет освобожден, а атрибут будет установлен с другим атрибутом, и для newSomeObject будет вызвано сохранение, чтобы гарантировать владение объектом. - person okami; 10.03.2010

Что вам нужно сделать в сеттере:

  1. Освободить любой старый объект
  2. Сохранить новый объект
  3. Назначьте новый объект вашей переменной экземпляра

Конечно, если вы делаете это буквально в таком порядке, вы рискуете слишком рано освободить объект в случае, когда старый и новый объекты совпадают. Вот где «автоматический выпуск» пригодится, потому что он планирует выпуск объекта, но только после возврата вашего метода.

Именование параметра метода и переменной экземпляра одинаково (IMHO) сбивает с толку и даст вам предупреждение компилятора, но если вы абсолютно настаиваете на том, чтобы делать это таким образом, вы можете использовать «self->», чтобы указать, что вы имеете в виду переменная экземпляра:

– (void)setSomeObject:(SomeObject *)someobject {

[self->someobject autorelease];

self->someobject = [someobject retain];

return;

}

Наконец, если ваш метод установки не должен делать что-то особенное, вам следует рассмотреть возможность использования @synthesize для автоматической генерации вашего метода установки/получения.

person David Gelhar    schedule 10.03.2010
comment
Давид, зачем ты ставишь возврат; Я тоже видел это на многих примерах и не понял, если метод вернет, то почему вы вызываете return? - person okami; 10.03.2010
comment
@okami нет веской причины. Я скопировал/вставил ваш исходный код и забыл удалить возврат;. Вы правы, это бесполезно. - person David Gelhar; 10.03.2010
comment
Но это на многих примерах из Mac Dev Center. Посмотрите: developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ Перейти к сеансу методов доступа - person okami; 10.03.2010
comment
Да, я это вижу. Но и там они не согласуются — в одних примерах есть, а в других нет. Это определенно ничего не дает. Может быть, некоторые авторы считают, что явное указание ничего не возвращать добавляет ясности? (Я не согласен с этой идеей, но, возможно, некоторые согласны.) - person David Gelhar; 10.03.2010