有人可以分享一些关于在init方法或指定初始化程序中使用@property iVars的最佳实践/代码约定的知识吗?
请看我的例子:
@interface MyClass ()
@property(nonatomic,strong) nsstring *tempString;
@property(nonatomic,strong) NSMutableArray *arrItems;
@end
@implementation ViewController
- (id)init
{
if (self = [super init]) {
//Is this best practice / correct
_tempString = @"";
_arrItems = [[NSMutableArray alloc] initWithCapacity:0];
...
...
//Or this
self.tempString = @"";
self.arrItems = [[NSMutableArray alloc] initWithCapacity:0];
}
return self;
}
@end
有关为何使用其中一种原因的建议?
...谢谢
答案 0 :(得分:2)
阅读此主题:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?
换句话说,如果您不打算使用KVO,您可以使用第二种方法:
//Or this
self.tempString = @"";
self.arrItems = [[NSMutableArray alloc] initWithCapacity:0];
但要注意使用alloc-init,不要忘记自动释放。
答案 1 :(得分:2)
Apple关于此主题的指南包含在恰当命名的部分Don’t Use Accessor Methods in Initializer Methods and dealloc中。
答案 2 :(得分:0)
通常情况下,在定义它时使用属性表示法更好,部分(主要是?)因为Jeremy提到的原因。
如果可以在方法设置器覆盖中设置断点并将其应用于修改变量的所有代码路径,则调试特定变量会轻松得多。
另一个原因是保持一致的内存管理模型,尽管由于使用ARC而不太重要。但是,如果你没有,并且强大的保留,那么你将确保你设置属性的对象在你设置属性的任何地方都是自动释放的,如果你直接设置它,则不必处理释放当前值的问题。变量
无论您使用何种做法,一致性对于维护/可读性和调试都很重要。
答案 3 :(得分:0)
我更喜欢属性的惰性实例化方法。
在您@synthesize
之后,您可以覆盖您的getter以懒惰地实例化您的属性
例如:
-(NSString *)tempString {
if(!tempString) {
_tempString = @"";
}
return _tempString;
}
和
-(NSMutableArray *)arrItems {
if(!_arrItems) {
_arrItems = [[NSMutableArray alloc] initWithCapacity:0];
}
return _arrItems;
}
如果您确实想要在init
方法中设置属性,请使用点表示法self.myProperty
,以便它使用为属性定义的setter而不是直接使用私有类方法。
答案 4 :(得分:0)
根据Apple的说法,您应 使用init...
或dealloc
方法中的访问者:
您应该始终直接从内部访问实例变量 一个初始化方法,因为在设置属性时, 对象的其余部分可能尚未完全初始化。即使你 不提供自定义访问器方法或知道任何副作用 在你自己的类中,未来的子类可能会很好地覆盖 行为。
取自此文档:Encapsulating Data。