【问题标题】:iPhone ivars vs using self: don't need autorelease? [duplicate]iPhone ivars 与使用自我:不需要自动释放? [复制]
【发布时间】:2011-10-16 17:00:46
【问题描述】:

可能重复:
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];

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

【问题讨论】:

标签: iphone objective-c


【解决方案1】:
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声明的,它会将它的retain count增加1,alloc init已经把retain count增加了1,所以总retain count是2。但是autorelease msg 将在下一个运行循环中将其减少 1 个概率。因此,您只需在您的 dealloc() 方法上发布它即可。

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

【讨论】:

    【解决方案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 保留计数,然后通过设置器添加了 +1 保留计数。

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

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

    看起来像这样(感谢@jamapag 修复)

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

    【讨论】:

    • 在上一个示例中,您创建了自动释放的 NSArray(没有分配),因此您不需要释放它。正确的代码是:[[NSArray alloc] initWithObject:@"Hello"]
    • 好地方是在没有测试的情况下尝试在浏览器中匆忙和干编码
    • 为什么最后一个例子更好?在所有这些中,似乎数组将在内存中,直到它在 dealloc 中被释放。
    • 您可能会遇到多次设置 ivar 的情况,在这种情况下,您希望在适当的时候尽快释放旧对象。
    猜你喜欢
    • 2011-07-01
    • 2011-06-04
    • 2011-05-03
    • 2011-11-09
    • 2011-03-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多