Stavo leggendo la documentazione di Apple sulla gestione della memoria quando sono arrivato a blocchi di pool di autorelease e qualcosa mi ha fatto riflettere.blocchi di pool autorilease iOS
Any object sent an autorelease message inside the autorelease pool block is
released at the end of the block.
Non sono sicuro di aver capito pienamente questo. Qualsiasi oggetto creato all'interno di un blocco pool di autorelease viene rilasciato alla fine del blocco in ogni caso perché è la sua durata. Perché dovresti chiamare autorelease sull'oggetto quando verrà rilasciato comunque quando raggiungerà la fine del blocco?
Per essere più chiaro, io darò un esempio, di quello che penso:
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init]; // no autorelease call here
/* use the object*/
//....
// in the end it should get deallocated because it's lifespan ends, right?
// so why do we need to call autorelease then?!
}
PS: Per favore non mi si venga a dire che a causa della ARC non abbiamo bisogno di fare alcune cose perché ARC si prende cura di loro. Ne sono pienamente consapevole, ma voglio lasciare ARC solo per qualche istante per capire il meccanismo di gestione della memoria.
quindi come va questa risposta alla mia domanda? Ho fornito un semplice esempio solo per evitare risposte come questa che non hanno molto a che fare con la domanda.Ho anche aggiunto commenti al piccolo esempio. – Teo
In genere si utilizzano i pool di autorelease solo in una funzione in cui è presente un elevato utilizzo di memoria e ne è necessario liberare prima del normale. Il paragrafo intendeva aggiungere contesto. – Kibitz503
Ok, quindi su un env non ARC, '' MyObject * obj = [[MyObject alloc] init]; '' all'interno di un pool di autorelease ci sarebbe una perdita di memoria ma su un env ARC, il compilatore aggiunge automaticamente una chiamata di rilascio per oggetto o perché non è più una perdita di memoria? – Teo