Frage

Ich habe Arbeit für iPhone-Entwicklung für eine Weile. Zum ersten Mal habe ich so überrascht, mit Memory-Management in Objective-c :). aber jetzt habe ich es ein wenig.

Die Frage ist, irgendwann, ich Protokoll als ein Attribut einer Klasse verwenden, weil ich seine Definition denke sehr ähnlich ‚Schnittstelle‘ in C # oder Java. wie unten.

@protocol Shield
   ...
@end

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

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

@end

, aber ich loslassen alway jedes Attribut Objekt in dealloc () -Methode. wie unten.

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

Wie Sie sehen, ich konnte nicht das Protokoll freigeben. So würde dies dazu führen, ich künftig Speicherproblem? Haben Sie eine andere Art und Weise haben diese Lösung zu behandeln mich zu beraten?

War es hilfreich?

Lösung

Sie benötigen Protokoll als die Einhaltung der NSObject Protokoll zu definieren, wie folgt aus:

@protocol Shield <NSObject>
   ...
@end

Es ist ganz einfach, wenn man weiß wie! ; -)

Edit: Auch sind Sie richtig - Protokolle in Objective-C sind äquivalent zu Schnittstellen in Java und C #

.

Ein weiterer edit: Es könnte seltsam schlagen, dies zu tun haben, aber Objective-C ermöglicht mehrere Root-Objekte, so kann man nicht wirklich garantieren, dass jedes Objekt von NSObject herabkommen wird. Da release eine NSObject Methode ist, müssen Sie die verwendete Protokoll definieren, wie auch an das <NSObject> Protokoll haftet, bevor Sie sicher sein können, es in der Lage sein wird, um die release Methode zu reagieren.

Andere Tipps

1 die richtige Sache zu tun, statt [Schild release] setzt

self.shield = nil;

2-Auch ändern

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

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

Dann sind Sie in Ordnung.

edit:

  

Der Grund, dass Sie vermeiden Halt   Delegierten sind, dass Sie ein vermeiden, müssen   behalten Schleife:

     

A erstellt B A setzt sich als B   delegieren ... A wird von seinem Besitzer freigegeben

     

Wenn B A beibehalten hätte, wäre ein nicht   freigegeben wird, besitzt als B A, also A ist   dealloc würde nie aufgerufen,   A und B verursacht lecken.

     

Sie sollten sich keine Sorgen über A weggeht   b / c es B besitzt und somit wird es los   in dealloc.

Warum sind Objective -C Delegierten in der Regel die Eigenschaft assign statt behalten gegeben?

Bitte UITableView Klassenreferenz für ein Beispiel Protokollerklärung finden Sie unter:

@property (nonatomic, zuweisen) id Delegat

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top