我有一个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
也许在第一种情况下,我可以在MyClass中说self.myFloat = 123.0;
和CGFloat f = self.myFloat;
?然后在第二种情况下,readonly
关键字阻止了作业self.myFloat = 123.0;
,但允许阅读CGFloat f = self.myFloat;
答案 0 :(得分:11)
选项readonly
表示只为此属性声明了getter方法。因此,如果没有setter,则无法通过myObject.myFloat=0.5f;
如果您未声明readonly
,则默认为read write
。
通过()扩展名声明属性不会修改访问模式,但会修改范围;它将是一个“私人”财产。
答案 1 :(得分:3)
@synthesize
使用@property
定义为iVar生成适当的getter / setter。指定readonly
时,不会生成任何setter。这并没有严格执行,因为如果你选择的话,你可以编写自己的setter(虽然这没有多大意义)。
声明类别中的属性只是将属性的范围定义为该类别。
答案 2 :(得分:1)
你是对的,将你的属性声明为readonly
,告诉编译器不要自动生成setter方法,因此self.myFloat = 123.0;
将是非法的(除非你手动创建该方法)。