2012-02-23 121 views
0

我在一些演示代码看过这个:属性:“分配”与“只读”

@property (readonly) SomeObject* someInstance;

什么是缺乏在我的眼里是要么转让,复制或保留任何提及;如果省略,它是什么类型的指针?显然,这是某种形式的指针,但我认为在没有retaincopy所有的指针,简直是assign,因为他们简单地指向和平等一切someInstance是。

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

回答

2

其他值(保留,复制,转让),只有不管你什么时候有一个setter参与。用这些属性生成的任何getter都是一样的。保留,复制或分配只有在设置值时才适用,因为您正在更改setter对传入对象执行的操作。由于此属性是只读的,这意味着您只创建一个getter来返回对象的指针,无所谓其他什么是因为你无法设置它。

+0

如果你只是简单地调用'someInstance'而没有点符号,那么'@ property'声明都不重要,对吗?因为那你可以设置它或做任何你想做的事,对吧?只有当你使用点符号时,你将无法设置它,对吗? – johnbakers 2012-02-23 04:49:49

+0

正确,如果您只是直接在代码中调用实例变量,而不通过点语法或方括号调用setter/getter,则属性不适用。 – 2012-02-23 04:52:33

+0

除非你使用ARC,否则我应该加上,然后强弱无关,但这是一个不同的故事。 – 2012-02-23 04:54:21

1

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

它可以是无论如何指定其中一个,如果你提供的,用户可以设置该属性,记录您的属性​​值的所有权(或没有)一些其他的方法有用。

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

+0

@property声明都不重要,如果你只是简单地调用someInstance没有点符号,对吧?因为那你可以设置它或做任何你想做的事,对吧?只有当你使用点符号时,你将无法设置它,对吗? – johnbakers 2012-02-23 04:50:37

+0

如果您不使用ARC,并且直接访问实例变量,则它们都不重要。如果您使用的是ARC,则声明的所有权必须与实例变量的所有权匹配。如果你正在使用ARC,并让'@ synthesize'创建实例变量,它会自动将属性声明中的所有权限制从属性声明复制到实例变量。 – 2012-02-23 04:53:39

+0

我修改了我的答案来讨论ARC与非ARC。 – 2012-02-23 04:56:06

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. 

只读是可写之一。有2,readwrite(默认)和只读。

分配是二传手语义之一。像保留/复制等

Apple Documentation