Разница между @property (nonatomic, readonly) и @property внутри расширения класса? - PullRequest
4 голосов
/ 21 ноября 2011

У меня есть класс Objective-C "MyClass". В MyClass.m у меня есть расширение класса, которое объявляет свойство CGFloat:

@interface MyClass ()
@property (nonatomic) CGFloat myFloat;
@end

@implementation MyClass
@synthesize myFloat;
//...
@end

Что изменяется (если что-нибудь), когда свойство объявляется с помощью ключевого слова readonly?

@interface MyClass ()
@property (nonatomic, readonly) CGFloat myFloat;
@end

@implementation MyClass
@synthesize myFloat;
//...
@end

Возможно, в первом случае я могу сказать self.myFloat = 123.0; и CGFloat f = self.myFloat; внутри MyClass? Затем во втором случае ключевое слово readonly запрещает присваивание self.myFloat = 123.0;, но позволяет читать CGFloat f = self.myFloat;

Ответы [ 3 ]

11 голосов
/ 21 ноября 2011

Опция readonly означает, что для этого свойства объявляется только метод getter.Таким образом, без установщика его нельзя изменить с помощью myObject.myFloat=0.5f;

Если вы не объявите его readonly, по умолчанию оно будет read write.

Объявление вашей собственности через() расширение не изменяет режим доступа, но изменяет область видимости;это будет "частная" собственность.

3 голосов
/ 21 ноября 2011

@synthesize использует определение @property для генерации подходящего метода получения / установки для iVar. Когда вы указываете readonly, сеттер не генерируется. Это не строго соблюдается, так как вы можете написать свой собственный установщик, если захотите (хотя это не имеет большого смысла).

Объявление свойства в категории просто определяет область действия свойства в этой категории.

1 голос
/ 21 ноября 2011

Вы правы, объявляя свое свойство как readonly, вы указываете компилятору не генерировать метод установки автоматически, и поэтому self.myFloat = 123.0; будет недопустимым (если вы не создадите этот метод вручную).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...