Sto sperimentando un po 'in C e sto cercando di implementare il mio sistema di conteggio di riferimento. Ho lavorato principalmente con Objective-C in passato ma gli oggetti autoreleasing di AFAIK sono qualcosa di unico per Objective-C.
Il problema con il conteggio dei riferimenti è che, quando si restituiscono oggetti dai metodi, non esiste un modo corretto per rilasciare l'oggetto e restituirlo allo stesso tempo. Se il conteggio dei riferimenti è 1 in rilascio, rilascia l'oggetto prima che possa essere restituito.
void *testMethod() {
return release(object); // Object is already deallocated :'(
}
Quindi, autorelando un oggetto, non viene deallocato all'istante. Invece, quando il pool di autorelease viene scaricato, vengono rilasciati tutti gli oggetti che erano autorelease nell'ambito del pool autorelease.
void *testMethod() {
return autorelease(object);
}
@autorelease {
object = retain(testMethod());
}
Come puoi vedere sopra, l'oggetto viene rilasciato quando termina il blocco @autorelease {}
, ovvero dopo che l'oggetto è stato nuovamente trattenuto. Questo risolve il problema.
Questa soluzione tuttavia può diventare un collo di bottiglia. Devi archiviare tutti gli oggetti che vengono rilasciati automaticamente in un array senza dimensioni predeterminabili, richiedendo a realloc
un sacco di volte. I loop che richiedono un pool di autorelease sono diventati molto più lenti a causa di questo.
C'è una soluzione migliore a questo problema?
O meglio, ci sono altre soluzioni a questo problema?