【问题标题】:why does it works fine without 'retain' the object?为什么它在没有“保留”对象的情况下工作正常?
【发布时间】:2011-04-19 08:37:12
【问题描述】:

在这里,我在方法“test”中为“tempString”使用了自动释放。根据规则,我应该在 main 中使用“[temp retain]”。但我没有使用它。它仍然可以正常工作并打印输出。那么“留”的需要是什么?谁能告诉我原因?提前致谢。

-(NSMutableString *) test : (NSMutableString *) aString{

 NSMutableString *tempString=[NSMutableString  stringWithString:aString];

 [tempString appendString:@" World"];

  return tempString;}

int main (){

 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 MemoryMgmt *memoryMgmt=[[MemoryMgmt alloc] init ];
 NSMutableString *str1 =@"Hello";

 NSMutableString *temp = [memoryMgmt test: str1];

 NSLog(@" %@",temp);

 [pool drain];
 return 0;
}

【问题讨论】:

    标签: iphone objective-c memory-management retain autorelease


    【解决方案1】:

    stringwithString 应该返回一个自动释放的NSMutableString,但实际上直到NSAutoReleasePool 耗尽时才会被释放。您正在使用该对象,而池仍然保留它,然后才排空池,释放该对象。

    当您从某个地方收到一个自动释放的对象时,只有在您打算在当前变量范围之外跟踪该对象时才应该保留它。如果您要保留该对象,但您的引用超出范围(就像在当前函数调用完成后所做的那样),您将泄漏该对象。

    您在此处所做的实际上是正确的,因为您不会在任何地方保留对 temp 的引用,而是在本地范围内。

    【讨论】:

      【解决方案2】:

      当您自动释放一个对象时,它将在运行循环结束时释放或释放池...在您的情况下,由于您启动了一个新线程,因此您管理自动释放池,字符串temp 直到你耗尽你的池子才会释放,因此当你使用它时,它仍然有效......希望有帮助

      【讨论】:

        【解决方案3】:

        之所以有效,是因为自动释放池在工具执行结束之前不会被清空。然而,它实际上是正确的用法:你从一个没有声称将所有权传递给调用者的方法返回一个自动释放的对象。有些人会这样做

        return [[tempString retain] autorelease];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-23
          • 2020-03-07
          • 2019-02-24
          • 2016-11-27
          • 1970-01-01
          • 2013-08-25
          • 1970-01-01
          • 2016-11-06
          相关资源
          最近更新 更多