属性:“assign”vs“readonly”

时间:2012-02-23 04:29:59

标签: objective-c

我在一些演示代码中看到了这一点:

@property (readonly) SomeObject* someInstance;

我眼中缺少的是提及分配,复制或保留;如果省略,它是什么类型的指针?显然它是某种指针,但我认为在没有retaincopy的情况下,所有指针都只是assign,因为它们只是指向并等于{{1}是的。

但我不想做出这样的假设。我发现,实际上这些概念看起来很容易理解,实际上这个概念可能有点难以理解。

4 个答案:

答案 0 :(得分:3)

其他值(保留,复制,分配)仅在涉及到setter时才有意义。使用任何这些属性生成的任何getter都是相同的。保留,复制或分配仅在设置值时才真正适用,因为您正在更改setter将对传入的对象执行的操作。由于此属性是readonly,这意味着您只创建一个getter来返回对象的指针,无论其他什么都没关系,因为无论如何都无法设置它。

答案 1 :(得分:1)

如果您不使用ARC,则assignretaincopy属性仅影响编译器生成的属性的setter方法。由于编译器不为readonly属性生成setter方法,因此您无需指定任何这些属性。

无论如何,如果您提供用户可以设置属性的其他方法,则记录您对属性值的所有权(或不记录),这可能是有用的。

如果您使用ARC和@synthesize,则属性的所有权必须与实例变量的所有权相匹配。如果让编译器生成实例变量,它将自动将属性的所有权属性应用于实例变量。

答案 2 :(得分:1)

**readonly**
Indicates that the property is read-only.
If you specify readonly, only a getter method is required in the @implementation block. If you use the @synthesize directive in the implementation block, only the getter method is synthesized. Moreover, if you attempt to assign a value using the dot syntax, you get a compiler error.

**assign**
Specifies that the setter uses simple assignment. This attribute is the default.
You use this attribute for scalar types such as NSInteger and CGRect.

readonly是可写性之一。有2,readwrite(默认)和readonly。

assign是 Setter Semantics 之一。喜欢保留/复制等。

Apple Documentation

答案 3 :(得分:0)

应该读这个 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

  

分配   指定setter使用简单赋值。这个   属性是默认值。