【问题标题】:using @property in ARC在 ARC 中使用 @property
【发布时间】:2012-04-19 03:42:02
【问题描述】:

当我声明一个没有存储规范 + 实例变量的属性时,一切正常:

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

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

@property (readonly, strong) NSSomething* mySomething;

这让我想知道我是否应该声明strong,但无论如何它应该是只读的.. 这里发生了什么?在哪种情况下我应该使用哪种方法?

编辑(对于那些无法复制问题的人):

【问题讨论】:

  • 我无法复制,您是否可以提供任何其他信息?这是我试过的代码:pastebin.com/4Mj1rzHd(用clang -fobjc-arc Untitled.m -framework Foundation编译)
  • 对于无法重现此问题的其他人,我相信这是 Xcode 4.2 附带的 LLVM 编译器版本本地化的问题,并且在 4.3+ 中不再警告您。我在 4.3 下编写的框架代码遇到了这个问题,但人们抱怨 4.2 下的编译错误。

标签: objective-c properties automatic-ref-counting instance-variables


【解决方案1】:

你说得对。如果您希望它是只读的,请确保将只读保留在其中。

但是,如果您希望为您合成 ivar,编译器需要知道是否将其设为强、弱或不安全未经训练。默认值是分配,它转换为不安全的未保留(这可能不是您想要的)。其他人报告说编译器会在没有警告的情况下正确处理默认值,但是由于您遇到问题,因此您需要在属性声明中保留属性。

或者,您可以像原来一样自己声明 ivar。

【讨论】:

  • 编译器默认为assign,见我对@user1258240的评论。来自 Apple 文档:“assign 指定 setter 使用简单赋值。此属性是默认值。”
  • 分配等同于不安全未保留。这可能不是您想要的。编译器让你在这里明确,所以你不会犯错误。
  • 我同意这可能不是我们想要的。我创建了一个测试 iOS ARC 项目并且无法复制该问题,并且根据 Apple 文档,不需要设置器语义。您是否复制了问题?
  • 不。不过我还没试过。我想这可能是版本之间的差异。他们最近发生了很大变化。
  • 废话,我想我使用 LLVM 3.0 失败了,没有更新到 LLVM 3.1?不过,感谢您的回答。
【解决方案2】:

您应该指定强或弱,这取决于您是否愿意 yourSomething 在其他人停止引用它时消失。如果该属性基于实例变量,则该属性自动为强。

此外,与上述决定无关,您应该将属性设置为只读,如果您不希望它有一个设置器(这样没有人将能够设置 yourObject.yourSomthing=something)。这意味着(除非您在 .m 文件中私下将该属性重新声明为可读写),否则无法直接将 yourSomething 设置为任何内容。如果 getter 不依赖于变量而是通过其他方式计算返回值,这将很有用。

【讨论】:

  • 您能否解释并提供以下语句的文档:“如果属性基于实例变量,则属性自动为强。”? assign 是默认的 setter 语义。见:The Objective-C Programming Language
  • 没有矛盾。strong 表示属性指针强指向对象,ivar 就是这种情况:它不会在指向它的对象之前释放。如果它还具有 assign 属性,则意味着我的 object.property=something 将属性变量设置为指向某物:这与复制相反,例如,相同的操作将复制某物并使属性指向某物到新的东西(强或弱,取决于属性是强还是弱)......
  • “如果它也有assign属性”不正确,只能有一个setter语义。来自上面提到的 Apple 文档:“Setter Semantics:这些属性指定了 set 访问器的语义。它们是互斥的。” strong 表示如果有 @synthesize 指令,它将创建与属性关键字匹配的代码。
  • 对不起,你(部分)是对的。但是,assign 仅适用于标量值,根本不适用于引用值。对于 NSSomething *,与问题一样,我认为它仍然无关紧要,我的答案仍然成立。
  • 正如你对太阳升起的避讳所表明的那样,你似乎很难同意别人的说法。根据我的经验,大多数人都会同意明天太阳会升起。 :-)
猜你喜欢
  • 2013-02-08
  • 2012-03-09
  • 1970-01-01
  • 2012-02-01
  • 2012-09-20
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多