Наличие свойств, которые возвращают копии объектов в получателе и сохраняют объекты в установщике - PullRequest
2 голосов
/ 07 января 2011

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

Пример:

MyType* theAttribute = MyObject.attribute;
[theAttribute changeSomething]; // Does not have to change the MyObject attribute, working with a copy return

MyType tmpObject = [[MyType alloc] init];
MyObject.attribute = tmpObject; // Want a retain here
[tmpObject release];

Ответы [ 4 ]

4 голосов
/ 07 января 2011

объявите свойство как сохраняемое в заголовке:

@property (nonatomic. retain) MyType *attribute;

В файле реализации синтезируйте iVar:

@synthesize attribute;

Но предоставьте свой собственный метод получения, который переопределит синтезированный:

- (MyType)attribute {
    return [attribute copy];
}

Я знаю, что я не выпускаю автоматически возвращаемый объект, но, поскольку вопрос не касается iOS, я пишу это с точки зрения среды сборки мусора.

2 голосов
/ 07 января 2011

В таком случае вы должны написать геттер и сеттер самостоятельно.

1 голос
/ 07 января 2011

Вы, вероятно, написали бы свои собственные средства доступа, но как именно это зависит от того, хотите ли вы, чтобы скопированный возврат "get" был автоматически освобожден или нет:

  1. Идиоматический способ выполнения «копирования» состоит в том, чтобы иметь обычное свойство «сохранить» для методов доступа и поддерживать также метод -copy или -mutableCopy. Последние два являются стандартом для семантического копирования объекта, и возвращенный объект должен иметь право владения.

  2. Если вы хотите, чтобы аксессор -foo возвращал копию "foo", чтобы вызывающий не мог манипулировать внутренней версией, это нормально, но тогда вы сами напишите, чтобы выглядеть так :

-

- (Foo *)foo
{
    return [[foo copy] autorelease];
}
0 голосов
/ 07 января 2011

Я бы предложил не возвращать копию.Это зацепит вас за управление памятью.Это автоматически выпущено?Не сохраняешь?Слишком много вопросов.

Вместо этого я рекомендую это:

MyType* attr = [MyType typeWithMyType:MyObject.attribute];

или что-то еще.

...