处理保留属性的最佳方法

时间:2010-12-05 12:34:42

标签: objective-c

如果你有一个具有保留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中的发布相结合

也许我错过了另一种方式。

3 个答案:

答案 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,而不是使用属性访问器。