【问题标题】:Objective-C/Cocoa: Do I have a memory leak here?Objective-C/Cocoa:我这里有内存泄漏吗?
【发布时间】:2009-04-06 20:01:49
【问题描述】:

我有一个如下所示的调用方法:

-(void)callingMethod
{
     NSMutableString *myStr = [[[NSMutableString alloc] initWithCapacity:0] autorelease];
     myStr = [self calledMethod];
}

还有我调用的方法:

-(NSMutableString*)calledMethod
{
    NSMutableString *newStr = [[NSMutableString alloc] initWithCapacity:0];
    // do some stuff with newStr
    return [newStr autorelease];
}

我在这里的任何地方都泄漏了内存吗?我觉得我在这里分配了不必要的金额。

【问题讨论】:

  • 糟糕,被调用的方法应该返回 NSMutableString* 或 NSString* 或 id。

标签: objective-c cocoa


【解决方案1】:

不,您没有泄漏内存,但是您在此处分配了不必要的数量的直觉是正确的。

至少,您应该考虑将callingMethod 重写为:

- (void)callingMethod
{
    NSMutableString *myStr = [self calledMethod];
}

你也可以把calledMethod整理成:

- (NSMutableString*)calledMethod
{
    return [NSMutableString stringWithCapacity:0]; // why 0 capacity?
}

【讨论】:

  • 哈哈哈...感谢杰森的编辑。猴看虚空,猴复制虚空:-)
  • 他没有在callingMethod中释放myStr。这不是内存泄漏吗?
  • 好问题...不,这不是因为 myStr 是自动释放的,因为它是使用 [NSMutableString stringWithCapacity] 调用创建的(而不是使用 [[NSMutableString alloc] init])
  • @euphoria:他不必……他不拥有它。如果他想在 callMethod 的范围之外使用它,他将不得不通过保留或复制它来获得它的所有权。到那时,他将不得不在稍后的某个时间释放它以避免内存泄漏。
  • 在他原来的例子中,它是故意自动发布的,所以也不用担心。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多