2013-10-08 1 views
0

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

@property(nonatomic,readonly)NSArray *languages; 

Назначение языков, прежде чем ARC было так:

languages=[[NSArray arrayWithObjects: 
       [[Language alloc]initWithCode:@"es"], 
       [[Language alloc]initWithCode:@"en"], 
       nil] retain]; 

Таким образом, я был и в состоянии сохранить объект, а также пометить его как неизменяемые наружу.

С ARC, Поскольку я не могу набрать «сохранить» вручную. Как я могу это сделать без переопределения сеттеров и геттеров? Есть ли способ пометить свойство как readonly (для внешнего), так и сохранить (внутри) для ARC?

+0

Возможный дубликат объектов [цель-c ARC-readonly и реализация частного сеттера] (http://stackoverflow.com/questions/8566671/objective-c-arc-readonly-properties-and-private-setter-implementation) – Rod

ответ

3

retain * и readonly действительно не имеют никакого отношения друг к другу. readonly указывает, что свойство имеет только геттер, а не сеттер. retain означает, что класс поддерживает сохраняющую (сильную) ссылку на объект, на который ссылается свойство, и в ARC, предполагая, что свойство поддерживается базовой, синтезированной переменной экземпляра, означает, что переменная экземпляра является переменной __strong.

Если вы хотите, чтобы свойство, доступное только для чтения, имело внешний вид, но может быть прочитано и записано внутри класса, вы можете повторно использовать свойство как readwrite в расширении класса в вашем файле реализации (.m). В заголовке:

@property (nonatomic, strong, readonly) NSArray *languages; 

Затем на верхней части .m:

@interface YourClass() 
    @property (nonatomic, strong, readwrite) NSArray *languages; 
@end 

Внутри реализации класса, теперь вы можете использовать self.languages = ...;, (или _languages = ...; в инициализаторе), чтобы задать язык имущество. На самом деле это не так по-разному в отношении ARC и non-ARC ...

* В ARC более привычно использовать strong вместо retain, но компилятор рассматривает их одинаково.

+3

Вам не нужно явно объявлять свойство как 'readwrite' в расширении класса, поскольку по умолчанию свойства' readwrite' являются свойствами. – neilco

+1

И для внешнего мира объекты будут иметь доступ только к тому, который только что читается; и, как внутри класса, так и внешнего мира, упоминается тот же NSArray? Просто чтобы угодить моему любопытству: если мы установим оба свойства выше «атомарным», будет ли какая-нибудь дополнительная работа для нас, когда в языках классов будет написана, а некоторые объекты за пределами этого класса пытаются ее прочитать? Благодарю. – Unheilig

+0

@neilco, это правда. Я предпочитаю быть откровенным о том, что происходит. –

Смежные вопросы