实例变量,属性和过渡到ARC

时间:2012-09-11 15:33:55

标签: ios automatic-ref-counting

最后我正在过渡到ARC。听起来太晚了,但是我的所有项目都有3.0的反向兼容性(关于App Store不支持的任何新闻?)所以我不能使用它。但现在我正在开发一个在iOS 5中进行基本部署的新项目,所以我正在使用ARC。

我的问题很简单。我习惯于声明私有实例变量和公共属性。例如:

@interface MyClass : NSObject {
@private

    Var *aVar_;
    Var *anotherVar_;
}

@property (nonatomic, readonly) Var *aVar;

@end

@implementation MyClass

@synthesize aVar = aVar_;

@end

在课程内部我使用实例变量,而不是属性。

但是现在我正在尝试避免实例变量因为我认为如果我使用proeprties就没有必要和冗余,而且我之前读过,最好使用属性而不是实例变量,但我不确定。那个班级现在看起来像那样

@interface MyClass : NSObject

@property (nonatomic, readwrite, strong) Var *aVar;

@end

@interface MyClass()

@property (nonatomic, readwrite, strong) Var *anotherVar;

@end

@implementation MyClass

@synthesize aVar = aVar_;
@synthesize anotherVar = anotherVar_;

@end

在这种情况下,我仍然使用实例变量(强调)来管理我的数据,因为它不那么冗长,ARC考虑了所有内存问题,但我不知道这是否正确。

我还有另一个问题。第一块代码中aVar的属性是readonly但如果我只使用属性,我必须使该属性读写。如果我想只读公共属性,我是否必须在@interface中声明一个公共readonly属性并在私有@interface中声明一个私有readwrite?

非常感谢你。

3 个答案:

答案 0 :(得分:1)

你的问题的答案有点复杂,但一般情况下你可以解决它。

由于ARC为您完成所有内存管理,因此只需使用ivar(类中的私有,在实现中声明)来满足您的内部需求。在这种情况下,所有用法都只使用名称。

使用属性,你可以从Xcode 4.4开始让Xcode合成setter和getter,以及ivar。自动合成的ivars使用前导“_”字符创建。

您可以在实现中将属性定义为只读,将其保留为只读,并在代码中将其设置为“_foo = ....”。 [这个网站上的很多人会认为这是一个不好的做法,我的观点是你可以做到这一点。]

Xcode 4.4有一个标题为“隐式合成属性”的警告,默认值为NO。如果您没有为每个属性提供@synthesize语句,这会产生警告,即使它仍然会进行综合。

就个人而言,我尽可能使用ivars,只在我需要向其他类公开某些内容时定义属性,或者我在多个文件中声明了类别(在这种情况下,我将类扩展的接口声明放在它自己的文件以及在其中定义的属性。)

答案 1 :(得分:0)

通过新的Objective-C更新,您甚至无需合成该属性。您需要做的只是声明@property (strong, nonatomic) Var *aVar;,编译器将自动添加合成,使用self.aVar实例变量支持_aVar属性。

答案 2 :(得分:0)

如果声明属性,即使ARC减少了一些内存管理错误,您的实现通常也应该使用该属性。

init中,有些人宁愿避免使用属性,因为这样做可能会触发仅部分初始化的对象(self)上的KVO。