最后我正在过渡到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?
非常感谢你。
答案 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。