0

最后,我正在过渡到 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第一段代码中的属性是只读的,但如果我只使用属性,我必须将该属性设为可读写。如果我想将公共属性设为只读,我是否必须在@interface 中声明公共只读属性并在私有@interface 中声明私有读写?

太感谢了。

4

3 回答 3

1

你的问题的答案有些复杂,但通常你有它的摇摆。

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

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

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

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

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

于 2012-09-11T15:45:35.330 回答
0

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

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

于 2012-09-11T15:45:28.710 回答
0

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

于 2012-09-11T15:37:55.497 回答