可能重复:
使用点语法设置保留属性时使用自动释放?
使用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"];
编译后的第二个调用将如下所示(假设您已将@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保留计数,然后通过setter添加+1保留计数。
这意味着您需要额外的释放来匹配您正在获取的保留。人们认为最好不要在iPhone中使用autorelease
,这样你就可以确保内存在你想要的时候被释放。因此,你通常应该采用模式
- 创建本地var
- 通过setter将本地var分配给ivar
- 释放本地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(很可能在下一个运行循环中(