1

当我宣布一个属性,而不使用存储规范+实例变量,一切工作愉快:使用@property在ARC

@interface Foo : NSObject { 
    NSSomething* mySomething; 
} 
@property (readonly) NSSomething* mySomething; 

然而,当我删除实例变量声明,我得到一个编译错误,指出我必须指定存储类型:

@property (readonly, strong) NSSomething* mySomething; 

这让我不知道我应该只需要声明强烈,但它应该是只读反正.. 这到底是怎么回事?我应该在哪种情况下使用哪种方法?

EDIT(对于那些无法复制的问题):

enter image description here enter image description here

+2

我无法复制,有没有其他信息可以提供?以下是我尝试的代码:http://pastebin.com/4Mj1rzHd(使用'clang -fobjc-arc Untitled.m -framework Foundation'编译) – 2012-04-05 11:58:06

+1

对于其他无法重现的代码,我认为这是本地化版本问题使用Xcode 4.2提供的LLVM编译器,并且您不再在4.3+版本中对此进行警告。我已经用我在4.3下编写的框架代码碰到过这个问题,但是人们抱怨4.2下的编译错误。 – 2012-04-07 15:50:55

回答

3

你是不是正确的。如果你只需要它,只要保持只读。

如果你想为你合成伊娃,编译器需要知道是否使它变得强大,弱小或不安全。默认值是转换为不安全的未分配(这可能不是你想要的)。其他人则报告说,编译器在没有警告的情况下正确处理默认值,但由于遇到问题,您需要在属性声明中使用retain属性。

或者,你可以像你最初一样声明自己的伊娃。

+0

编译器默认为'assign',请参阅我对@ user1258240的评论。从Apple文档中:“assign指定setter使用简单赋值,该属性是默认值。” – zaph 2012-04-05 12:40:49

+0

分配等同于不安全的未保留。这可能不是你想要的。编译器让你在这里明确,所以你不会犯任何错误。 – wbyoung 2012-04-05 12:42:53

+0

我同意这可能不是我想要的。我创建了一个测试iOS ARC项目,并且不能复制问题,并且根据Apple文档,不需要设置语义。你有没有复制这个问题? – zaph 2012-04-05 12:46:41

1

您应该指定强或弱,这取决于您是否愿意在其他人停止引用时您的某些内容会消失。如果该属性基于实例变量,则属性自动变强。另外,独立于上述决定,您应该将属性设置为只读,如果您不希望它具有setter(所以没有人能够设置yourObject.yourSomthing =某些东西)。这意味着(除非您在.m文件中私下重新声明该属性为readwrite),否则无法直接将您的某个东西设置为任何东西。如果getter不依赖于变量,而是通过其他方式计算返回值,这会很有用。

+0

您能解释并提供声明的文档:“如果该属性基于实例变量,则属性自动变强。”?'assign'是默认的setter语义。请参阅:[Objective-C编程语言](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html) – zaph 2012-04-05 12:34:18

+0

没有矛盾。强烈意味着属性指针强烈指向对象,这是一个ivar的情况:它在指向它的对象之前不会被释放。如果它也具有assign属性,则意味着我的object.property = something将属性变量设置为指向某些东西:这与副本相反,例如,在相同的操作将复制某些内容并使属性点到新的东西(无论是强还是弱,取决于财产是强还是弱)...... – user1258240 2012-04-05 13:23:24

+0

“如果它也具有赋值属性”不正确,则只能有一个赋值语义。从上面提到的Apple文档:“Setter语义:这些属性指定了set访问器的语义,它们是互斥的。” 'strong'表示如果有'@ synthesize'指令,它将创建与属性关键字匹配的代码。 – zaph 2012-04-05 13:34:54