¿Este código objective-c causa pérdida de memory?

Compare los siguientes 2 fragments:

Muestra 1:

[[UIApplication shareApplication] openURL: [NSURL URLWithString:@"http://stackoverflow.com"]] 

y muestra 2:

 NSURL *url = [[NSUrl URLWithString:@"http://stackoverflow.com"]; [[UIApplication shareApplication] openURL: url]; [url release]; 

¿La muestra 1 causa fuga de memory? ¿La [url release] en la muestra 2 es networkingundante?

Si ocurre una pérdida de memory, ¿qué tan malo es?

La muestra 1 no provoca una pérdida de memory y es la forma general de hacerlo. El object NSURL se autorealiza y, por lo tanto, no se supone que debe lanzarlo usted mismo (como en la muestra 2).

La muestra 1 está perfectamente bien, como ya se describió anteriormente. Sin embargo, la muestra 2 debería provocar un locking. -URLWithString: se autorealiza, por lo que su recuento de retención efectivamente será cero cuando se drene el siguiente pool de autorelease. Liberarlo explícitamente como lo estás haciendo traerá su recuento de retención a 0 inmediatamente, lo que resulta en una desasignación. Entonces, cuando se vacía el grupo de autorelease, intentará soltar esa cadena de nuevo, lo que provocará un locking.

Siempre es mejor usar el command Crear y analizar en Xcode. Puede detectar y advertir sobre casi todos los problemas de pérdida de memory, aunque no es perfecto. Aún así, es una buena práctica.

@BoltClock, creo que no estás del todo correcto al decir que el object se autorelease en la muestra 1.

En la muestra 2, a una variable denominada url se le asigna el object devuelto por el [NSUrl URLWithString:] , incrementando así su recuento de [NSUrl URLWithString:] en 1. Para equilibrarlo, necesitamos release . Mientras que en la muestra 1, la reference al object se pasa directamente al receptor y no tenemos nada de qué preocuparse por su recuento de retención, por lo tanto, no hay liberación.

Tenga en count que no somos autoelevadores, ya que no hemos retenido nada en primer lugar. "¡No hay ninguna variable en el código que se está autorelease!"

Por favor, corrígeme si estoy conceptualmente equivocado en alguna parte. Y solo para completar esto, no hay fugas en ninguna de las muestras y ambas son forms correctas de hacer esto.