2015-03-22 2 views
-1
@interface ViewController : UIViewController{ 
    NSNumber *nmbr; 

} 
@property (nonatomic, readonly) NSNumber *nmbr; 
- (NSNumber*)nmbr; 
- (void)setNmbr:(NSNumber *)value; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self setNmbr:[NSNumber numberWithInt:4]]; 
    NSLog(@"Value of number is: %@", self.nmbr); 

} 

- (NSNumber*)nmbr{ 
    return nmbr; 
} 

- (void)setNmbr:(NSNumber *)value{ 
    nmbr = value; 
} 

@end 

Я ожидаю программу, чтобы не позволить setNmbr работы функции, потому что NMBR свойства в файле интерфейс только для чтения. Но он устанавливает значение nmbr. Что я делаю неправильно?почему только для чтения сеттер свойства работают Objective C

ответ

2

readonly не мешает вам писать собственный сеттер. Он просто запрещает компилятору синтезировать сеттер для вас. Было бы неплохо, если бы он предупредил вас, если вы внедрили сеттер для свойства readonly, но это не так.

Очевидно, что нецелесообразно реализовать сеттер для объекта readonly. Кроме того, вы вообще даже не объявляли бы ivar и не реализовали бы геттер для этого свойства, потому что они оба были бы синтезированы для вас (если вы не делали там что-то особенное, а это не так).

+0

На самом деле, нет ничего необычного в том, чтобы реализовать сеттер для свойства readonly, но он обычно как-то закрыт. (Предоставление свойства readonly не позволит вам назначить свойство * * - вызовы setter должны быть явными.) –

+0

Да, но если вы это сделаете, наилучшая практика предложит переопределить квалификатор 'readonly' в расширении частного класса , Таким образом, открытый интерфейс будет 'readonly', но объявление' @ property' в частном '@ interface' будет' readwrite'. (Опять же, как и мой главный ответ, вам не нужно это делать, но это лучшая практика, ИМХО.) И, кстати, если вы это сделаете, вам не нужно вручную внедрять сеттер (если, конечно, вы делаете что-то особенное, что действительно требует этого), но частный интерфейс 'readwrite' заставит его синтезировать для вас. – Rob

0

Если вы создаете объект в объективе-c, он создает для вас 3 вещи.

  1. переменной экземпляра, который вы можете получить доступ с помощью подчеркивания перед именем свойства. Пример: _nmbr
  2. метод получения, который вы можете вызвать напрямую, используя имя свойства. Пример: [self nmbr]; это на самом деле вызовет метод - (NSNumber *)nmbr {}.
  3. метод сеттера, который вы можете вызвать с помощью ключевого слова 'set' перед ним. Пример: [self setNmbr:@1]; это фактически вызовет метод - (void)setNmbr:(NSNumber *)nmbr {}.

сказал, что вам не нужно явно определять геттеры и сеттеры. Objective-C дает вам эти геттеры и сеттеры по умолчанию.

Вы можете получить доступ к установщику в вышеуказанном вопросе, потому что вы явно устанавливаете их, которые вам не нужно делать.

Надеюсь, это поможет.

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