2010-03-10 1 views
0

Я делаю метод set:сохранить объект в объективе-c

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

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

    [someobject autorelease]; 

    someobject = [newSomeobject retain]; 

    return; 

} 

на [SOMObject autorelease] Я заявляю, что я не хочу больше владеть объектом под сферу setSomeObject.

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

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

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

ответ

1

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

Для ваших задач управления памятью, проверить Apple's programming guide.

+0

Хорошо, я прочитал и понял. Благодарю. Будет отображен некоторый объект, и атрибут будет установлен с другим атрибутом, а сохранение вызвано в newSomeObject, чтобы обеспечить право собственности на объект. – okami

2

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

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

    someobject = [newObject retain]; 
} 

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

0

Что вам нужно выполнить в инкубаторе является:

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

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

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

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

[self->someobject autorelease]; 

self->someobject = [someobject retain]; 

return; 

}

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

+0

Дэвид, почему ты возвращаешь; Я также видел это на многих примерах и не понимал, если метод вернется, почему вы называете возврат? – okami

+0

@okami no хорошая причина. Я скопировал/вставил ваш оригинальный код и забыл удалить «return;». Вы правы, что это нецелесообразно. –

+0

Но это на многих примерах от Mac Dev Center.Посмотрите: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB Перейдите на сеанс «Методические схемы» – okami