可能重复:
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];
另外,在第一种情况下我需要自动释放吗?
答案 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
被认为是更好的,因此您可以确保在需要时释放内存。因此,您通常应采用模式
看起来像这样(由于@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很快(很可能在下一个运行循环中)