@property (nonatomic, readonly)和类扩展中的@property有什么区别?

4

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

11

readonly选项意味着仅为此属性声明了getter方法。因此,没有setter方法,它无法通过myObject.myFloat = 0.5f;进行修改。

如果您不声明它为readonly,则默认情况下是read write

通过()扩展声明属性不会修改访问模式,但会修改作用域; 它将成为“private”属性。


3

@synthesize使用@property定义生成适当的getter/setter iVar。当您指定readonly时,不会生成setter。尽管这并不是严格强制执行的,但如果选择,您可以编写自己的setter(尽管这没有太多意义)。

在类别中声明属性只是定义属性的范围为该类别内部。


1

你说得对,将你的属性声明为 readonly,你告诉编译器不要自动生成setter方法,因此self.myFloat = 123.0;将是非法的(除非你手动创建该方法)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接