当我声明没有存储规范+实例变量的属性时,一切都很愉快:
@interface Foo : NSObject {
NSSomething* mySomething;
}
@property (readonly) NSSomething* mySomething;
然而,当我删除实例变量声明时,我收到一个编译错误,指出我必须指定存储类型:
@property (readonly, strong) NSSomething* mySomething;
这让我想知道我应该宣布强大,但它应该只是readonly .. 这里发生了什么?我应该在哪种情况下使用哪种方法?
编辑(对于那些无法复制问题的人):
答案 0 :(得分:3)
你做得对。如果您只想读取它,请将readonly留在那里。
如果您希望为您合成ivar,编译器需要知道是否使其强大,弱或不安全。默认值为assign,转换为unsafe unretained(可能不是您想要的)。其他人报告说编译器在没有警告的情况下正确处理默认值,但是由于你遇到了麻烦,你需要在属性声明中使用retain属性。
或者,您可以像原先一样自己申报ivar。
答案 1 :(得分:1)
你应该指定强或弱,这取决于你是否愿意在别人停止引用它时你的东西会消失。如果属性基于实例变量,则属性自动强大。
此外,独立于上述决定,您应该将该属性设置为只读,如果您不希望它具有setter(因此没有人能够设置yourObject.yourSomthing =某些东西)。这意味着(除非您私下将该属性重新声明为.m文件中的readwrite),否则无法直接将YourSomething设置为任何内容。如果getter不依赖于变量,而是通过其他方式计算返回值,这可能很有用。