ARC e autoreleasepool

di Anonimizzato10204 il
13 risposte
Ho un po' di confusione, ARC e autoreleasepool sono la stessa cosa o non hanno niente a che fare tra di loro?

13 Risposte

  • Ciao Orso Bruno,
    Sono due cose diverse, l' ARC mantiene il conteggio dei riferimenti ad un oggetto e lo distrugge quando va a zero. L' autorleasepool è una cosa simile ma distrugge gli oggetti quando si arriva alla fine del blocco autorelease.
  • Pero quanto creo un progetto ARC mi mette un autoreleasepool.
  • Si ma sono due cose diverse, se guardi bene l' autoreleasepool te lo mette di default anche quando non usi ARC.
  • Ho capito che sono due cose diverse ma alla fine quale usa ?
  • Porta pazienza ! la cosa tra l' altro è complicata perchè si è evoluta rapidamente e se guardi la documentazione in giro troverai un sacco di confusione.

    Prova a crearti una tua classe con un metodo dealloc che scrive un log (con NSLog) poi crea un progetto ARC e prova a istanziare la variabile e guarda cosa succede.
  • Come mai quando chiamo [super dealloc] da errore?
  • In ARC non si possono più usare esplicitamente 'dealloc' 'retain' 'autorelease' ecc. è una vera pacchia

    Ecco una classe di esempio:
    
    @interface MyClass : NSObject
    {
        int a;
    }
    -(id)initWithValue:(int) value;
    @end
    
    -------------------------------
    
    @implementation MyClass
    -(id)initWithValue:(int) value
    {
        self = [super init];
        a = value;
        return self;
    }
    
    -(void) dealloc
    {
        NSLog(@"%d dealloc", a);
    }
    @end
    
    Prova a istanziarla qua e là e osserva cosa succede. (per identificare l' istanza ho messo un numero e non una stringa per non essere disturbati dalle loro allocazioni)
  • Continuo a non capire lo scopo dell' autorelease pool, mi sembra che se ne potrebbe fare a meno.
  • In effetti e poco chiaro.
    Adesso prova a scrivere questa funzione:
    
    MyClass* CreateMyClass(int n)
    {
        MyClass* p = [[MyClass alloc] initWithValue:n];
        return p;
    }
    
    E prova a richiamarla nell' autoreleasepool, vedrai che anche se metti la variabile cha hai assegnato a nil, non verrà distrutta subito ma alla fine dell pool. Questo perchè l' ARC mette i valori di ritorno delle funzioni dentro il pool.
  • Quindi usare ARC è come avere la garbage collection, non ti devi preoccupare più di nulla.
  • Non sono proprio la stessa cosa comunque anche ARC è molto comoda, la differenza tra le due e che con garbage collection non sai quando la variabile verrà deallocata, mentre ARC è deterministica.
  • Allora ARC è addirittura meglio della garbage collection?
  • No, meglio proprio no. Con garbage collection non ti devi preoccupare proprio di nulla mentre con ARC ci sono dei casi particolari in cui devi scrivere del codice apposito. Ad esempio nel caso di classi che sono in rapporto padre/figlio (ovvero ognuna ha un puntatore all' altra). Ma qui stiamo andando fuori tema e non c' entra niente con l' autorelease pool.
Devi accedere o registrarti per scrivere nel forum
13 risposte