¿Es correcto decir que los métodos cuyos nombres contienen nuevos, asignar, crear o copiar no liberan automáticamente los objetos que crean?

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

Pregunta

Hasta donde yo sé, solo la "conveniencia" los métodos devuelven los objetos creados con un -autorelease, para que el receptor no sea responsable de la memoria de ese objeto. Pero porque Apple dice que cuando usa un método que tiene un nombre que consiste en " new " ;, " alloc " ;, " create " o "copiar", usted es responsable de liberar el objeto que devuelve el método, creo que estos métodos no deberían liberar estos objetos. De lo contrario, serían "convenientes". y el receptor no será responsable en absoluto mientras no retenga el objeto recibido. ¿Lo entendí bien?

¿Fue útil?

Solución

La regla general es que posee (y, por lo tanto, debe liberar) cualquier objeto que

  • alloc (usando un método que comienza " alloc " o " new " *)
  • copia (utilizando cualquier método que contenga la palabra copia)
  • retener explícitamente usted mismo

* new combina un alloc y un init en un método.

Los métodos de conveniencia devuelven objetos que se liberan automáticamente. Estos son válidos para el alcance del método en el que los recibe y se pueden transferir a un método de llamada (generalmente). Si desea mantenerlos por más tiempo, debe conservarlos.

Otros consejos

La respuesta a la pregunta en el título es sí, sin embargo:

  

solo la "conveniencia" Los métodos devuelven los objetos creados con un -autorelease

Eso definitivamente no es cierto. Se supone que cualquier método que no tenga una de las palabras de marcador (o que tenga documentación específica que indique lo contrario) devuelve un objeto al que no tiene una referencia de retención. Los constructores de conveniencia ciertamente pertenecen a ese grupo, pero también lo hacen la mayoría de los otros métodos en Cocoa.

Devolver un objeto del cual no es responsable de liberar es la regla de Cocoa, no la excepción.

Todo esto se explica claramente en documentación en línea de Apple sobre la memoria gestión en cacao ; Realmente deberías leer esos documentos a fondo. Muchas de las preguntas que hace en este sitio se responden allí, y es la fuente definitiva.

Eso es correcto. La palabra oficial está en Sitio para desarrolladores de Apple Esto es para CoreFoundation, pero también se aplica a Cocoa.

Casi.

No creo " crear " Es una de las palabras clave definidas de las directrices de Apple.

De lo contrario su lógica es correcta. La clase de ese método no retiene el objeto que devuelve el método.

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

Consulte la documentación de Apple en Propiedad y eliminación de objetos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top