Domanda

Lavoro per lo sviluppo di iPhone da un po '. La prima volta, sono rimasto così sorpreso dalla gestione della memoria in object-c :). ma ora l'ho preso un po '.

La domanda è, a volte, uso il protocollo come attributo di una classe, perché penso che la sua definizione sia molto simile all '"interfaccia" in C # o Java. come sotto.

@protocol Shield
   ...
@end

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

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

@end

ma rilascio sempre qualsiasi oggetto attributo nel metodo dealloc (). come sotto.

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

Come vedi, non sono riuscito a rilasciare il protocollo. Quindi questo mi causerebbe un futuro problema di memoria? Hai un altro modo di gestire questa soluzione per consigliarmi?

È stato utile?

Soluzione

Devi definire il tuo protocollo come aderente al NSObject protocollo, in questo modo:

@protocol Shield <NSObject>
   ...
@end

È semplice quando sai come! ; -)

Modifica: inoltre, hai ragione: i protocolli in Objective-C sono equivalenti alle interfacce in Java e C #.

Un'altra modifica: potrebbe sembrare strano doverlo fare, ma Objective-C consente più oggetti root, quindi non puoi effettivamente garantire che ogni oggetto scenderà da release. Poiché <NSObject> è un metodo <=>, devi definire il tuo protocollo come anche aderente al protocollo <=> prima di poter essere sicuro che sarà in grado di rispondere al metodo <=>.

Altri suggerimenti

1-la cosa giusta da fare invece di [release dello scudo] sta impostando

self.shield = nil;

2-Cambia anche

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

a

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

Allora stai bene.

modifica:

  

Il motivo che eviti di conservare   delegati è che è necessario evitare a   keep loop:

     

A crea B A si imposta come B   delegato & # 8230; A è rilasciato dal suo proprietario

     

Se B avesse mantenuto A, A non lo sarebbe   rilasciato, poiché B possiede A, quindi A   dealloc non verrebbe mai chiamato,   causando la perdita di A e B.

     

Non dovresti preoccuparti che A se ne vada   b / c possiede B e quindi si libera di esso   in dealloc.

Perché sono obiettivi -C I delegati di solito assegnano la proprietà invece di conservare?

consultare il riferimento della classe uitableview per una dichiarazione di protocollo di esempio:

@property (nonatomic, assegnato) id < & UITableViewDelegate gt; delegato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top