2011-05-06 21 views
7

, estoy teniendo dificultades para determinar cuándo asignar un objeto. Estoy repasando el libro de Apress iPhone Dev for Beginners. A veces se dice que el uso:En Objective C, cuándo se usa alloc y cuándo no es

UIImage *seven = [UIImage imageNamed:@"seven.png"]; 

y otras veces,

UIImageView *sevenView = [[UIImageView alloc] initWithImage:seven]; 

¿Por qué no alloc UIImage en el primer ejemplo?

Gracias - Absolute Beginner.

Respuesta

2

La convención es que siempre que llame a [Foo alloc], tiene que [liberar] el objeto Foo resultante después. Por otro lado, si el método se llama [fooWithBar], o algo similar, devuelve un objeto liberado automáticamente, el que se liberará automáticamente cuando regrese la función llamada al sistema actual.

0

Esto puede ser confuso al principio. En los ejemplos anteriores, el método [UIImage imageNamed] es un método de conveniencia estático que los creadores de la API decidieron que sería útil. Bajo las cubiertas ese método le devolverá un autoreleased objeto del tipo UIImage.

Al utilizar la API de Cocoa Touch se se familiarizarán con ellos y la conveniencia de usar funciones, etc., se sentirá más natural.

Nota: En los dos casos se ha señalado anteriormente, uno le dará un UIImage autoreleased y el segundo le dará una UIImageView que usted tiene que liberar específicamente cuando se quiere renunciar a la propiedad del objeto (o se le obtener una pérdida de memoria).

Para obtener más información sobre UIImage vs UIImageView echa un vistazo a este thread.

9

initWithImage: es un método de instancia: el mensaje debe enviarse a un objeto en particular. Usted crea una instancia de objeto de este tipo con alloc.

imageNamed: es un método de clase. No necesita ser enviado a una instancia de la clase, por lo que no asigna un objeto. Tales métodos que devuelven objetos a menudo asignan e inician un objeto "debajo del capó".

Puede encontrar la información sobre qué métodos son métodos de clase y cuáles son métodos de instancia en la referencia de clase. Además, las declaraciones de métodos de clase comienzan con + como en + (UIImage *)imageNamed:(NSString *)name, métodos de instancia con - como en - (id)initWithData:(NSData *)data. Por favor, alloc es solo un método de clase de NSObject.

0

Una buena regla empírica es que desea utilizar -alloc cuando sabe que su objeto se mantendrá en ese objeto durante mucho tiempo, o cuando está creando un objeto que nunca tendrá que salir el alcance del método en el que se creó; en ambos casos, puede evitar la sobrecarga (aunque pequeña) que provoca la liberación automática de un objeto, y saber que está minimizando la huella de su memoria; de manera predeterminada, los objetos liberados automáticamente no serán realmente liberado hasta el próximo ciclo de ejecución, que podría ser considerablemente lejano en el futuro.

Dicho esto, utilizar métodos de conveniencia a menudo hace que sea más fácil producir un objeto con ciertas condiciones, y los objetos liberados automáticamente en general son muy útiles para devolver objetos a la pila.

Cuestiones relacionadas