2010-09-30 12 views
0

Ici, j'ai utilisé la publication automatique pour 'tempString' dans la méthode 'test'. Selon la règle, je devrais utiliser "[temp retenir]" dans le principal. Mais je ne l'ai pas utilisé. cela fonctionne toujours bien et imprime la sortie. Alors, quel est le besoin de "retenir"? Quelqu'un peut-il me dire la raison? Merci d'avance.Pourquoi ça marche bien sans "retenir" l'objet?

-(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; 
} 

Répondre

4

stringwithString doit retourner un autoreleased NSMutableString, mais cela ne se fait pas libéré avant les drains NSAutoReleasePool. Vous utilisez l'objet alors que la piscine le retient encore et ne vidange la piscine qu'après, libérant l'objet. Lorsque vous recevez un objet auto-libéré de quelque part, vous ne devez le conserver que si vous avez l'intention de garder une trace de l'objet au-delà de la portée variable actuelle. Si vous deviez conserver l'objet, mais que votre référence était hors de portée (comme c'est le cas après la fin de l'appel de votre fonction actuelle), vous fuiriez l'objet.

Ce que vous faites ici est en fait correct, puisque vous ne gardez pas la référence à temp n'importe où mais dans votre portée locale.

0

Lorsque vous AutoRelease un objet, il sortira à la fin de la boucle d'exécution lorsque la piscine est drainée ou libéré ... Dans votre cas, puisque vous commencez un nouveau thread, vous gérez le autorelease piscine, la température de chaîne ne libère pas jusqu'à ce que vous videz votre piscine, donc lorsque vous l'utilisez, il est toujours valable ... l'espoir qui aide

0

Cela fonctionne parce que le pool Autorelease n'est pas vidé jusqu'à la fin de l'exécution de l'outil. Cependant, il s'agit en fait d'une utilisation correcte: vous renvoyez un objet autoreleased d'une méthode qui ne prétend pas transmettre la propriété à l'appelant. Certaines personnes le font

return [[tempString retain] autorelease];