9

Esto ya es una pregunta de respuesta dentro de SO pero No puedo encontrarlo en la documentación de Apple en ningún lado. ¿Podrías apuntarme en la dirección correcta?performSelector: withObject: y su comportamiento de retención

Dentro de los siguientes temas

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

el comportamiento por defecto parece ser la siguiente: Conserva el receptor y el argumento (s).

estoy usando el siguiente código

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

donde userData es un oject autoreleased.

Registrando el conteo de retención (Sé que podría no ser válido hacerlo) los datos pasados ​​en incrementos su conteo de retención. Cuando se invoca el método en el delegado, el conteo de retención no es igual a uno.

Entonces, mi pregunta es: ¿necesito realizar alguna gestión de memoria para evitar fugas o tengo que confiar en las cosas de Apple? Aquí estoy hablando como un agnóstico ya que no puedo encontrar los documentos correctos.

Gracias de antemano.

+0

Creo que el conteo de retención ya no es preciso según ARC – Dustin

+0

@Cake No estoy usando ARC en este proyecto. Gracias. –

+0

Para proyectos habilitados para ARC, puede consultar http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown – rishi

Respuesta

11

Está buscando la función incorrecta en la documentación.

Retener

performSelector:withObject:afterDelay: y funciones similares (conafterDelay) retener el receptor y argumentos, debido a que la ejecutan después

no retiene

performSelector:withObject: y funciones similares (sinafterDelay) do no retienen nada, ya que solo llaman a la función directamente.

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

hace exactamente lo mismo como

[[self delegate] tryToSendStoreData:userData]; 
+0

+1 por su apoyo. Pero no puedo encontrar ningún documento para esto. Además, ¿por qué el recuento de retenciones incrementa su valor después de realizar esa llamada? Gracias. –

+0

@Flex_Addicted: es común para las funciones retener y luego liberar automáticamente sus argumentos, para mayor seguridad. Es por eso que mirar el conteo retenido es inútil – newacct

+0

Gracias. Luego, si tiene algún documento, por favor vincule. Aclamaciones. –

10

Mientras @newacct dio la respuesta correcta, pero no fuera por la pregunta que @Flex_Addicted había pedido, es decir, citas de la documentación de Apple que el comportamiento observado de hecho está garantizado. A continuación se muestra una citación (parcial), pero vamos a tener que pasar por un par de aros para conseguir allí -

La documentación para performSelector:withObject:afterDelay: establece que

Este método establece un temporizador para realizar la aSelector mensaje en el ciclo de ejecución del hilo actual.

así que la próxima nos dirigimos a la documentación de NSRunLoop y allí nos encontramos con que sólo existe un método que permite la capacidad de encolar cosas en el bucle de ejecución -
performSelector:target:argument:order:modes:, cuya documentación indica que

Este método configura un temporizador para realizar el mensaje aSelector en el ciclo de ejecución del subproceso actual al comienzo de la siguiente iteración del ciclo de ejecución. El temporizador está configurado para ejecutarse en los modos especificados por el parámetro de modos ... El receptor retiene los objetos objetivo y anArgument hasta que se dispare el temporizador para el selector, y luego los libera como parte de su limpieza.

Por supuesto, nada garantiza que [NSObject performSelector:withObject:afterDelay:] siempre utiliza [NSRunLoop performSelector:target:argument:order:modes:] (aunque esta respuesta estaría completo si alguien podría venir con la documentación para eso), pero al menos este es un paso hacia el misterio de responder a las adivinanzas las las sagradas escrituras nos acechan.

Cuestiones relacionadas