È giusto dire che i metodi che contengono nomi che contengono nuovi, allocare, creare o copiare non rilasciano automaticamente gli oggetti che creano?

StackOverflow https://stackoverflow.com/questions/811547

Domanda

Per quanto ne so, solo la "convenienza" i metodi restituiscono gli oggetti creati con un rilascio automatico, in modo che il destinatario non sia responsabile della memoria di quell'oggetto. Ma poiché Apple afferma che quando si utilizza un metodo che ha un nome costituito da "nuovo", "allocato", "creato" o "copia", sei responsabile del rilascio dell'oggetto restituito dal metodo, penso che questi metodi non dovrebbero rilasciare automaticamente questi oggetti. Altrimenti sarebbero "convenienti" e il destinatario non sarebbe affatto responsabile fintanto che non trattenga l'oggetto ricevuto. Ho capito bene?

È stato utile?

Soluzione

La regola empirica è che possiedi (e quindi devi rilasciare) qualsiasi oggetto che

  • alloc (utilizzando un metodo che avvia " alloc " o " new " *)
  • copia (usando qualsiasi metodo contenente la parola copia)
  • mantieni esplicitamente te stesso

* new combina un'allocazione e un init in un metodo.

I metodi di convenienza restituiscono oggetti rilasciati automaticamente. Questi sono validi per l'ambito del metodo in cui li ricevi e possono essere restituiti a un metodo chiamante (in genere). Se vuoi mantenerli più a lungo, devi conservarli.

Altri suggerimenti

La risposta alla domanda nel titolo è sì, tuttavia:

  

solo la "convenienza" i metodi restituiscono gli oggetti creati con un -autorelease

Questo non è assolutamente vero. Si presume che qualsiasi metodo che non abbia una delle parole marcatore (o che abbia una documentazione specifica che dica altrimenti) restituisca un oggetto a cui non si ha un riferimento di conservazione. I costruttori di convenienza rientrano sicuramente in quel gruppo, ma lo stesso vale per la maggior parte degli altri metodi in Cocoa.

Restituire un oggetto che non sei responsabile del rilascio è la regola di Cocoa, non l'eccezione.

Tutto ciò è chiaramente spiegato nella la documentazione online di Apple sulla memoria gestione in cacao ; dovresti davvero leggere attentamente quei documenti. Molte delle domande che stai ponendo su questo sito hanno una risposta lì, ed è la fonte definitiva.

È corretto. La parola ufficiale è Sito per sviluppatori di Apple Questo è per CoreFoundation, ma si applica anche a Cocoa.

Quasi.

Non credo " crea " è una delle parole chiave definite dalle linee guida Apple.

Altrimenti la tua logica è corretta. L'oggetto restituito dal metodo non viene mantenuto dalla classe di quel metodo.

NSObject *obj = [[someClass alloc]init]; // you are responsible
NSObject *obj = [someClass someConvenientMethod]; // the object is auto-released, you do not own this object

Consulta la documentazione di Apple su Proprietà e smaltimento degli oggetti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top