如果你有一个具有保留setter的属性的对象,哪个是最佳做法?
1
-(id)init {
if((self = [super init])) {
self->_retainingProperty = [[NSObject alloc] init];
}
return self;
}
2
-(id)init {
if((self = [super init])) {
self.retainingProperty = [[NSObject alloc] init];
[self.retainingProperty release];
}
return self;
}
3
-(id)init {
if((self = [super init])) {
NSObject *obj = [[NSObject alloc] init];
self.retainingProperty = obj;
[obj release];
}
return self;
}
所有这些都将与dealloc中的发布相结合
也许我错过了另一种方式。
答案 0 :(得分:4)
我通常只是这样做:
- (id ) init
{
self = [super init];
if ( self )
{
retainingProperty = [[NSObject alloc] init];
}
return self;
}
我不会建议#2或#3,除非你知道他们可能会调用你不想要的KVO东西。
答案 1 :(得分:1)
以上所有都很好并且大致相同。您还可以使用其名称访问成员变量:
-(id)init {
if((self = [super init])) {
_retainingProperty = [[NSObject alloc] init];
}
return self;
}
属性设置器实际上只是方便的方法,以确保正确完成保留/释放舞蹈,所以如果你正确地做事,你可以没有它们。
如果您在setter方法中添加了一些自定义逻辑,则可能需要始终使用属性setter语法来确保调用它。或者,您可能希望在某些情况下故意回避该逻辑,从而避免在某些情况下使用它。这取决于你 - 无论你的用例如何。
答案 2 :(得分:1)
至少还有两种其他方式可以立即浮现在脑海中。有直接的ivar访问:
- (id) init
{
if ( self = [super init] )
{
_retainingProperty = [[NSObject alloc] init];
}
return self;
}
或者您可以使用自动释放池:
- (id) init
{
if ( self = [super init] )
{
self._retainingProperty = [[[NSObject alloc] init] autorelease];
}
return self;
}
根据属性的类别,可能还有与后者等效的便捷方法。
就个人而言,我几乎总是选择直接进入ivar。在init
中调用属性访问器通常被认为是不好的形式,因为它们可能具有在对象未完全初始化时不希望发生的副作用。
类似的注意事项适用于dealloc
,顺便说一句:最好直接release
你的ivars,而不是使用属性访问器。