iPhone ivars vs使用self:不需要自动释放?

时间:2011-07-30 22:12:55

标签: iphone objective-c

  

可能重复:
  Use autorelease when setting a retain property using dot syntax?

使用ivars和self之间有什么区别。符号

instanceVar是使用retain。

声明的实例变量

1)instanceVar = [[NSMutableArray alloc] initWithObjects:@“1”,@“2”]; //我需要在这里自动发布?????

2)self.instanceVar = [[NSMutableArray alloc] initWithObjects:@“1”,@“2”] autorelease];

另外,在第一种情况下我需要自动释放吗?

2 个答案:

答案 0 :(得分:2)

这可以在多个地方解释,但似乎你问的不同是什么

第一个电话未改变,如下所示:

instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"];

编译时的第二个调用看起来像这样(假设您使用了@property retain@synthesize

self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"];
// The previous line will compile to this next line
[self setInstanceVar:[[NSMutableArray alloc] initWithObjects:@"1", @"2"]];

- (void)setInstanceVar:(NSMutableArray *)instanceVar;方法的主体看起来像这样(编译器因为你的@property@sythesize而为你创建了这个):

- (void)setInstanceVar:(NSMutableArray *)anInstanceVar
{
    if (instanceVar != anInstanceVar) {
        [instanceVar release];
        instanceVar = [anInstanceVar retain];
    }
}

因此在通话中

self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"];

您在新创建的NSMutableArray上有+1保留计数,然后您通过设置器添加了+1保留计数。

这意味着您需要额外的版本来匹配您正在使用的保留。在iPhone中不使用autorelease被认为是更好的,因此您可以确保在需要时释放内存。因此,您通常应采用模式

  1. 创建本地var
  2. 通过setter
  3. 将本地var分配给ivar
  4. 发布local var
  5. 看起来像这样(由于@jamapag而固定)

    NSArray *tmpMyArray - [[NSArray alloc] initWithObject:@"Hello"];
    self.myArray = tmpMyArray;
    [tmpMyArray release]; tmpMyArray = nil;
    

答案 1 :(得分:0)

1) instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"]; //do I need autorelease here?????

创建NSmutableArray时保留计数为1,您需要在dealloc()方法中发布instanceVar

2) self.instanceVar = [[NSMutableArray alloc] initWithObjects:@"1", @"2"] autorelease];

这里使用的是setter,由于它是用retain声明的,它会将保留计数增加1,alloc init已经将保留计数增加了1,因此总保留计数为2。自动释放消息将在下一个运行循环中减少1个概率。因此,您只需要在dealloc()方法上发布此内容。

在第一种情况下,你可能不要想要自动发布,因为这是一个IVar,你可能想再次使用它,如果你autorelease它的保留计数将是0很快(很可能在下一个运行循环中)