Розетка только для чтения? - PullRequest
2 голосов
/ 17 мая 2011

Допустим, у меня есть класс. Я хотел бы объявить свойство следующим образом:

  1. Из-за пределов класса он должен быть доступен только для чтения при программном доступе ;
  2. Должно быть возможно установить значение из Interface Builder с помощью розетки;
  3. (Внутри класса это должно быть доступно для записи, но я знаю, как это сделать).

«Решение», которое я нашел, - написать одноразовый сеттер:

- (void) setA: (ClassA *)a {
    if (aHaveBeenSet)
        return;
    else {
        // do what a setter have to do
        aHaveBeenSet == YES;
    }
}

Но этот сеттер все еще может быть вызван из кода (хотя только один раз в силе), так что это не совсем решение.

Другой способ - пометить ivar как IBOutlet и сделать свойство readonly следующим образом:

@interface MyClass : NSObject {
     IBOutlet ClassA *a;
}
@property (readonly) ClassA *a;
@end

Но согласно этому ответу , это плохой стиль и делает управление памятью неясным.

Есть идеи?

1 Ответ

3 голосов
/ 17 мая 2011

Кто-то исправит меня, если я ошибаюсь, но я думаю , что механизм загрузки NIB проверяет метод установки только при создании экземпляра файла .nib во время выполнения.Таким образом, это означает, что вы можете объявить свое публичное свойство как доступное только для чтения, но написать «приватный» сеттер в свой файл .m:

// MyClass.h
@property (readonly, retain) IBOutlet ClassA *a;

// MyClass.m
@interface MyClass ()
@property (readwrite, retain) ClassA *a;
@end

@implementation MyClass
@synthesize a;
...
@end
...