在ARC中使用@property

时间:2012-04-05 11:43:44

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

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

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

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

@property (readonly, strong) NSSomething* mySomething;

这让我想知道我应该宣布强大,但它应该只是readonly .. 这里发生了什么?我应该在哪种情况下使用哪种方法?

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

enter image description here enter image description here

2 个答案:

答案 0 :(得分:3)

你做得对。如果您只想读取它,请将readonly留在那里。

如果您希望为您合成ivar,编译器需要知道是否使其强大,弱或不安全。默认值为assign,转换为unsafe unretained(可能不是您想要的)。其他人报告说编译器在没有警告的情况下正确处理默认值,但是由于你遇到了麻烦,你需要在属性声明中使用retain属性。

或者,您可以像原先一样自己申报ivar。

答案 1 :(得分:1)

你应该指定强或弱,这取决于你是否愿意在别人停止引用它时你的东西会消失。如果属性基于实例变量,则属性自动强大。

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

相关问题