@property(非原子,readonly)和@property内部类扩展之间的区别?

时间:2011-11-21 19:19:04

标签: objective-c ios properties

我有一个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;

3 个答案:

答案 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;将是非法的(除非你手动创建该方法)。