ARC e autoreleasepool

di il
13 risposte

ARC e autoreleasepool

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

13 Risposte

  • Re: ARC e autoreleasepool

    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.
  • Re: ARC e autoreleasepool

    Pero quanto creo un progetto ARC mi mette un autoreleasepool.
  • Re: ARC e autoreleasepool

    Si ma sono due cose diverse, se guardi bene l' autoreleasepool te lo mette di default anche quando non usi ARC.
  • Re: ARC e autoreleasepool

    Ho capito che sono due cose diverse ma alla fine quale usa ?
  • Re: ARC e autoreleasepool

    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.
  • Re: ARC e autoreleasepool

    Come mai quando chiamo [super dealloc] da errore?
  • Re: ARC e autoreleasepool

    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)
  • Re: ARC e autoreleasepool

    Continuo a non capire lo scopo dell' autorelease pool, mi sembra che se ne potrebbe fare a meno.
  • Re: ARC e autoreleasepool

    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.
  • Re: ARC e autoreleasepool

    Quindi usare ARC è come avere la garbage collection, non ti devi preoccupare più di nulla.
  • Re: ARC e autoreleasepool

    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.
  • Re: ARC e autoreleasepool

    Allora ARC è addirittura meglio della garbage collection?
  • Re: ARC e autoreleasepool

    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