2010-09-30 4 views
0

Здесь я использовал автоматический выпуск для 'tempString' в методе 'test'. Согласно правилу, я должен использовать «[temp сохранить]» в основном. Но я не использовал его. все равно он отлично работает и печатает выходные данные. Тогда в чем же необходимость «сохранить»? Может ли кто-нибудь рассказать мне причину? Заранее спасибо.Почему он отлично работает, не «сохраняя» объект?

-(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 [email protected]"Hello"; 

NSMutableString *temp = [memoryMgmt test: str1]; 

NSLog(@" %@",temp); 

[pool drain]; 
return 0; 
} 

ответ

4

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

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

Что вы здесь делаете, это действительно правильно, поскольку вы не держите ссылку на temp в любом месте, кроме локального.

0

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

0

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

return [[tempString retain] autorelease];