这在多个地方都有解释,但似乎你问有什么不同
第一次调用没有改变,看起来像这样:
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,这样您就可以确保在需要时释放内存。因此,您通常应该采用该模式
- 创建本地变量
- 通过 setter 将本地 var 分配给 ivar
- 释放本地变量
看起来像这样(感谢@jamapag 修复)
NSArray *tmpMyArray - [[NSArray alloc] initWithObject:@"Hello"];
self.myArray = tmpMyArray;
[tmpMyArray release]; tmpMyArray = nil;