Gestione della memoria in Objective C per iOS

di il
10 risposte

Gestione della memoria in Objective C per iOS

Ciao a tutti
Posto qui una domanda sull' objective C, ditemi se esiste una sezione più adatta.

Con l' objective-C in iOS la gestione della memoria è automatica, tramite garbage collection, oppure no e si fanno le malloc/free o le new/delete?

10 Risposte

  • Re: Gestione della memoria in Objective C per iOS

    Dal ios 5 esiste garbage collector prima no. Devi fare a mano.
  • Re: Gestione della memoria in Objective C per iOS

    Con le ultime versioni di xcode, creando un nuovo progetto in obj-c (foundation) di base il main.m si presenta così:
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            // insert code here...
            NSLog(@"Hello, World!");
            
        }
        return 0;
    }
    dalla poca esperienza che ho sembra che cmq tutta la parte di codice che andiamo a scrivere si trova dentro questo autoreleasepool che, correggetemi anzi aiutatemi, libera tutto.
    Ma se io devo liberare una parte della memoria, ad esempio dopo aver chiamato una funzione? questo autoreleasepool sembra un interruttore generale che quando serve libera tutto, ma all'interno del codice che faccio, non libero più quando non necessario delle porzioni di memoria?
  • Re: Gestione della memoria in Objective C per iOS

    skynet ha scritto:


    Dal ios 5 esiste garbage collector prima no. Devi fare a mano.
    Ciao skynet,
    l' aggionamento per iOS 5 è disponibile anche per tutti i dispositivi precedenti iPad1, iPad2, iPhone vari ecc.?
    Per chi parte adesso è ragionevole non preoccuparsi della compatibilità con iOS4 e precedenti?
  • Re: Gestione della memoria in Objective C per iOS

    Io so che solo dal 3gs puoi aggiornarlo fino al 5.1. i precedenti ho paura di no. poi anch'io sono agli inizi come te quindi ci impariamo vicenda come si dice.
  • Re: Gestione della memoria in Objective C per iOS

    Ciao a tutti
    Ho guardato un po in giro e per ora sono arrivato qui:
    L' Objective-C fornisce tre sistemi per la gestione della memoria:

    - MMR ovvero Manual Retain Release in cui la gestione della memoria è manuale, la classe NSObject (base di tutti gli oggetto del framework Foundation) fornisce un meccanismo di 'Reference Counting' per aiutarti in questo compito.

    - ARC ovvero Automatic Reference Counting, ovvero viene usato l' MMR ma in maniera automatica da parte del compilatore. Questo sistema è fortemente raccomandato. Quando si crea un nuovo progetto in XCode viene proposto di attivare l' ARC.

    - Garbage Collection è disponibile su OSX e su iOS ma solo a partire dalla versione 5. È un meccanismo diverso da quello dell' ARC ma gli effetti sono gli stessi, il rilascio della memoria è automatico.

    toti81 ha scritto:


    dalla poca esperienza che ho sembra che cmq tutta la parte di codice che andiamo a scrivere si trova dentro questo autoreleasepool che, correggetemi anzi aiutatemi, libera tutto.
    L' AutoreleasePool ha a che fare con l' ARC (non è quindi garbage collection e và anche con gli iOS vecchi).
    Quando viene abilitato l' ARC (l' abilitazione è di default quando si crea il progetto) nel codice compaiono dei riferimenti all' AutoreleasePool.

    Ovviamnete non mi è tutto chiaro (è un modo come un altro per dire che non ho ancora capito un tubo), adesso cerco di fare qualche esempio. Al momento mi sono fatto l' idea che MMR è superata e Garbage Collection è prematura visto che ciò che viene abilitato di default è ARC.

    Questo link può essere utile: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
  • Re: Gestione della memoria in Objective C per iOS

    skynet ha scritto:


    Io so che solo dal 3gs puoi aggiornarlo fino al 5.1. i precedenti ho paura di no. poi anch'io sono agli inizi come te quindi ci impariamo vicenda come si dice.
    ciao skynet
    l' aggiornamento degli iPad2 a iOS5 è possibile e non da nessun problema, mentre gli aggiornamenti da iPad1 sono possibili ma alcuni utenti hanno lamentato dei problemi (che comunque guardando in rete sembrano risolvibili).
  • Re: Gestione della memoria in Objective C per iOS

    Ciao toti81

    toti81 ha scritto:


    con le ultime versioni di xcode, creando un nuovo progetto in obj-c (foundation) di base il main.m si presenta così:
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            // insert code here...
            NSLog(@"Hello, World!");
            
        }
        return 0;
    }
    dalla poca esperienza che ho sembra che cmq tutta la parte di codice che andiamo a scrivere si trova dentro questo autoreleasepool che, correggetemi anzi aiutatemi, libera tutto.
    Ma se io devo liberare una parte della memoria, ad esempio dopo aver chiamato una funzione? questo autoreleasepool sembra un interruttore generale che quando serve libera tutto, ma all'interno del codice che faccio, non libero più quando non necessario delle porzioni di memoria?
    Da quello che ho letto l' uso dell' autoreleasepool è fortemente consigliata, serve per gestire il rilascio degli oggetti (quindi da non confondere con la gestione di eventuali malloc o new). Negli esempi potrai vedere due modi differenti di usare l' autorelease pool, quello classico in cui viene creato e poi distrutto e quello che hai scritto tu tramite la direttiva @autoreleasepool.
    
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
          ... allocazioni
        [pool drain];
    
        // oppure (anzi meglio)
     
        @autoreleasepool {
            ... allocazioni
        }
    
    L' uso di un autorelease pool è semplice, dopo che hai allocato un oggetto invece di preoccuparti del suo rilascio e del conteggio dei riferimenti lo inserisci in un autoreleasepool chiamando il metodo 'autorelease':
    
       [myObject autorelease];
    
    Questa istruzione inserisce l' oggetto nell' autoreleasepool più interno il quale provvederà a distruggerlo al momento opportuno. Ho detto 'più interno' perche puoi crere quanti autorelease pool ti pare e nidificarli uno dentro all' altro, ad esempio puoi perfino farlo dento un ciclo in cui allochi oggetti che vuoi distruggere appena dopo il loro uso.
  • Re: Gestione della memoria in Objective C per iOS

    A quindi non centra niente con la malloc o cmq con il garbage collection?
    grazie della info, al momento il salto che sto facendo tra C e Obj-C è tutt'altro che semplice...
    in futuro, appena faccio un bel po' di pratica, sicuramente dovremo approfondire la questione memoria e l'autoreleasepool...
  • Re: Gestione della memoria in Objective C per iOS

    toti81 ha scritto:


    a quindi non centra niente con la malloc o cmq con il garbage collection?
    grazie della info, al momento il salto che sto facendo tra C e Obj-C è tutt'altro che semplice...
    in futuro, appena faccio un bel po' di pratica, sicuramente dovremo approfondire la questione memoria e l'autoreleasepool...
    Mi piacerebbe discurere sul percorso da seguire per programmare iOS, se partire dal C e fare un lungo apprendistato o partire immediatamante con la programmazione a oggetti.
    Dato che qui è OT apro un nuovo thread.
  • Re: Gestione della memoria in Objective C per iOS

    Ok, allora posto nel nuovo thread la mia esperienza in merito...
Devi accedere o registrarti per scrivere nel forum
10 risposte