iPhone ivars vs 使用自我:不需要自动发布?



可能重复:
使用点语法设置保留属性时使用自动释放?

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

instanceVar是用retain声明的实例变量。

1( instanceVar=[[NSMutableArray alloc]initWithObjects:@"1",@"2"]//我这里需要自动释放吗?????

2( self.instanceVar=[[NSMutableArray alloc]initWithObjects:@"1",@"2"]自动释放];

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

这在多个地方进行了解释,但似乎正如您所问的有什么不同

第一个调用没有变化,看起来是这样的:

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

编译后的第二个调用将如下所示(假设您已将@propertyretain@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保留计数,然后通过setter添加+1保留计数。

这意味着您需要额外的释放来匹配您正在获取的保留。人们认为最好不要在iPhone中使用autorelease,这样你就可以确保内存在你想要的时候被释放。因此,你通常应该采用模式

  1. 创建本地var
  2. 通过setter将本地var分配给ivar
  3. 释放本地var

它看起来是这样的(由于@jamapag而固定(

NSArray *tmpMyArray - [[NSArray alloc] initWithObject:@"Hello"];
self.myArray = tmpMyArray;
[tmpMyArray release]; tmpMyArray = nil;
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(很可能在下一个运行循环中(

最新更新