1

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

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

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

@property (readonly, strong) NSSomething* mySomething;

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

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

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

3

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

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

或者,您可以像最初一样自己声明 ivar。

于 2012-04-05T11:56:27.797 回答
1

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

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

于 2012-04-05T11:57:19.937 回答