我在一些演示代码看过这个:属性:“分配”与“只读”
@property (readonly) SomeObject* someInstance;
什么是缺乏在我的眼里是要么转让,复制或保留任何提及;如果省略,它是什么类型的指针?显然,这是某种形式的指针,但我认为在没有retain
或copy
所有的指针,简直是assign
,因为他们简单地指向和平等一切someInstance
是。
但我不想做这样的假设。我发现,这些属性看起来似乎很容易理解,但实际上这个概念可能有点困难。
我在一些演示代码看过这个:属性:“分配”与“只读”
@property (readonly) SomeObject* someInstance;
什么是缺乏在我的眼里是要么转让,复制或保留任何提及;如果省略,它是什么类型的指针?显然,这是某种形式的指针,但我认为在没有retain
或copy
所有的指针,简直是assign
,因为他们简单地指向和平等一切someInstance
是。
但我不想做这样的假设。我发现,这些属性看起来似乎很容易理解,但实际上这个概念可能有点困难。
其他值(保留,复制,转让),只有不管你什么时候有一个setter参与。用这些属性生成的任何getter都是一样的。保留,复制或分配只有在设置值时才适用,因为您正在更改setter对传入对象执行的操作。由于此属性是只读的,这意味着您只创建一个getter来返回对象的指针,无所谓其他什么是因为你无法设置它。
如果您未使用ARC,则assign
,retain
和copy
属性仅影响属性的编译器生成的setter方法。由于编译器不会为readonly
属性生成setter方法,因此不需要指定任何这些属性。
它可以是无论如何指定其中一个,如果你提供的,用户可以设置该属性,记录您的属性值的所有权(或没有)一些其他的方法有用。
如果您正在使用ARC和@synthesize
,财产的所有权必须实例变量的所有权相匹配。如果让编译器生成实例变量,它将自动将属性的所有权属性应用于实例变量。
@property声明都不重要,如果你只是简单地调用someInstance没有点符号,对吧?因为那你可以设置它或做任何你想做的事,对吧?只有当你使用点符号时,你将无法设置它,对吗? – johnbakers 2012-02-23 04:50:37
如果您不使用ARC,并且直接访问实例变量,则它们都不重要。如果您使用的是ARC,则声明的所有权必须与实例变量的所有权匹配。如果你正在使用ARC,并让'@ synthesize'创建实例变量,它会自动将属性声明中的所有权限制从属性声明复制到实例变量。 – 2012-02-23 04:53:39
我修改了我的答案来讨论ARC与非ARC。 – 2012-02-23 04:56:06
**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(默认)和只读。
分配是二传手语义之一。像保留/复制等
分配 指定setter方法使用简单的任务。这个 属性是默认的。
如果你只是简单地调用'someInstance'而没有点符号,那么'@ property'声明都不重要,对吗?因为那你可以设置它或做任何你想做的事,对吧?只有当你使用点符号时,你将无法设置它,对吗? – johnbakers 2012-02-23 04:49:49
正确,如果您只是直接在代码中调用实例变量,而不通过点语法或方括号调用setter/getter,则属性不适用。 – 2012-02-23 04:52:33
除非你使用ARC,否则我应该加上,然后强弱无关,但这是一个不同的故事。 – 2012-02-23 04:54:21