почему он работает нормально без «сохранения» объекта? - PullRequest
0 голосов
/ 30 сентября 2010

Здесь я использовал авто-релиз для 'tempString' в методе 'test'. Согласно правилу, я должен использовать «[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 ]

4 голосов
/ 30 сентября 2010

stringwithString должен возвращать автоматически выпущенный NSMutableString, но на самом деле он не освобождается до тех пор, пока NSAutoReleasePool не истечет.Вы используете объект, пока пул все еще удерживает его, и только после этого сливаете пул, освобождая объект.

Когда вы получаете откуда-либо автоматически освобожденный объект, вы должны сохранять его, только если вы намереваетесь отслеживатьобъект за пределами текущей области видимости переменной.Если бы вы сохранили объект, но ваша ссылка должна была выйти из области видимости (как это происходит после завершения текущего вызова функции), вы бы потеряли объект.

То, что вы здесь делаете, на самом деле правильно,поскольку вы не сохраняете ссылку на temp нигде, кроме своей локальной области.

0 голосов
/ 30 сентября 2010

Это работает, потому что пул автоматического выпуска не очищается до конца выполнения инструмента. Однако на самом деле это правильное использование: вы возвращаете автоматически освобожденный объект из метода, который не претендует на передачу прав собственности вызывающей стороне. Некоторые люди делают

return [[tempString retain] autorelease];
0 голосов
/ 30 сентября 2010

Когда вы автоматически освобождаете объект, он освобождается в конце цикла выполнения, когда пул очищается или освобождается ... В вашем случае, поскольку вы запускаете новый поток, вы управляете пулом автоматического выпуска, строка temp не запускается, пока вы не истощите свой пул, поэтому, когда вы его используете, он все еще действует ... надеюсь, что это поможет

...