0

在这里,我在“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;
}
4

3 回答 3

4

stringwithString应该返回一个 autoreleased NSMutableString,但实际上直到NSAutoReleasePool排水管才被释放。您正在使用该对象,而池仍保留它,之后才排空池,释放该对象。

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

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

于 2010-09-30T13:40:35.920 回答
0

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

于 2010-09-30T13:40:32.787 回答
0

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

return [[tempString retain] autorelease];
于 2010-09-30T13:42:48.507 回答