Pregunta

He trabajado para el desarrollo de iPhone por un tiempo. Primera vez, me sorprendió mucho la gestión de la memoria en Objective-C :). pero ahora lo tengo un poco.

La pregunta es, en algún momento, uso el protocolo como un atributo de una clase, porque creo que su definición es muy similar a 'interfaz' en C # o Java. como a continuación.

@protocol Shield
   ...
@end

// Interface
@interface Dragon {
    id<Shield> shield
    NSString * name;
}

@property (nonatomic,retain) id<Shield> shield;
@property (nonatomic,retain) NSString * name;

@end

pero siempre libero cualquier objeto de atributo en el método dealloc (). como a continuación.

-(void)dealloc {
   [name release];
   [shield release];  // <--- Totally impossible. xcode said '-release not found in protocol'
   [super dealloc];
 }

Como puede ver, no pude liberar el protocolo. Entonces, ¿esto me causaría un problema de memoria en el futuro? ¿Tiene otra forma de manejar esta solución para aconsejarme?

¿Fue útil?

Solución

Debe definir su protocolo como adherido al protocolo NSObject, así:

@protocol Shield <NSObject>
   ...
@end

¡Es simple cuando sabes cómo! ;-)

Editar: Además, tienes razón: los protocolos en Objective-C son equivalentes a las interfaces en Java y C #.

Otra edición: puede parecer extraño tener que hacer esto, pero Objective-C permite múltiples objetos raíz, por lo que no puede garantizar que cada objeto descenderá de release. Dado que <NSObject> es un método <=>, debe definir su protocolo para que también se adhiera al protocolo <=> antes de poder estar seguro de que podrá responder al método <=>.

Otros consejos

1-lo que se debe hacer en lugar de [liberación del escudo] es configurar

self.shield = nil;

2-También cambiar

@property (nonatomic,retain) id<Shield> shield; 

a

@property (nonatomic,assign) id<Shield> shield;

Entonces estás bien.

editar:

  

La razón por la que evitas retener   delegados es que debes evitar un   retener bucle:

     

A crea B A se establece como B   delegar & # 8230; A es lanzado por su propietario

     

Si B hubiera retenido A, A no sería   liberado, ya que B posee A, por lo tanto A   Dealloc nunca sería llamado,   haciendo que tanto A como B se filtren.

     

No debes preocuparte de que A se vaya   b / c posee B y por lo tanto se deshace de él   en dealloc.

¿Por qué son objetivos? -C a los delegados generalmente se les asigna la propiedad en lugar de retener?

consulte la referencia de clase de uitableview para ver una declaración de protocolo de ejemplo:

@property (no atómico, asignar) id < UITableViewDelegate & Gt; delegar

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