为什么没有'保留'对象就可以正常工作?

时间:2010-09-30 13:26:53

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

这里我在方法'test'中使用了'tempString'的自动释放。根据规则,我应该在主要使用“[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;
}

3 个答案:

答案 0 :(得分:4)

stringwithString应该返回自动释放的NSMutableString,但实际上在NSAutoReleasePool耗尽之前不会释放。您正在使用该对象,而池仍然保留它,之后仅释放池,释放对象。

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

你在这里做的事实际上是正确的,因为你没有将temp的引用保留在本地范围内的任何地方。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

return [[tempString retain] autorelease];