9 Stimmen

Frage zu Delegierten

Dieser Code ist ziemlich einfach, ist er korrekt? Ich weiß nicht, ob ich den Delegaten, der über die init-Methode übergeben wird, beibehalten sollte.

@interface SomeClass : NSObject {
    SomeClassDelegate *someClassDelegate;
}
-(id)initWithDelegate:(SomeClassDelegate *)delegate;
@end

@implementation SomeClass
-(id)initWithDelegate:(SomeClassDelegate *)delegate
{
    [delegate retain]; // should I be doing this?
    someClassDelegate = delegate;
}
-(void)dealloc
{
    [delegate release]; // obviously only do  this if I DO need to retain it
    [super dealloc];
}
@end

Mein erster Gedanke war nein, aber dieses Stück Code scheint etwas anderes zu bedeuten. Ich weiß, ich kann nicht auf behalten zählt verlassen, aber ich möchte den richtigen Weg, um mit Delegaten zu behandeln wissen.

// self's retain count is 1
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
// the retain count is now 2, did the init of URLConnection retain self?

1 Stimmen

NSURLConnection ist ein etwas spezieller Fall. Es ist nicht so sehr, dass es den Delegaten beibehält, sondern dass es ihn beibehält für die Dauer der Verbindung da die einzige Möglichkeit, den Empfang von Delegatenmeldungen zu beenden, darin besteht, die Verbindung abzubrechen. D.h. normalerweise behält man einen Delegaten nicht, und das Verhalten von NSURLConnection ist ein Implementierungsdetail; nicht etwas, auf das man sich verlassen oder das man im Allgemeinen nachahmen sollte. Außerdem ist es ungewöhnlich, einen Delegaten zu haben Klasse . Normalerweise deklarieren Sie ein Delegiertenprotokoll.

0 Stimmen

Danke Mike, das erklärt, was ich sehe.

11voto

hbw Punkte 15232

Nein, im Allgemeinen sollten Sie den Delegierten nicht beibehalten. Da der Delegat bereits einen Verweis auf Ihr Objekt hat, würden Sie einen zirkulären Verweis erstellen, wenn Sie den Delegaten behalten. Aus demselben Grund können Sie auch davon ausgehen, dass Ihr Objekt zerstört wird, bevor der Delegat zerstört wird.

Überprüfen Sie estos Artikel für weitere Informationen über die Verwendung/Implementierung von Delegierten.

EDIT: Es gibt ein paar Ausnahmen, auf die andere bereits hingewiesen haben.

0 Stimmen

Vielen Dank für die Artikel, sie haben mich in meiner Meinung über Delegierte bestätigt. Mike hat mir in den Kommentaren zu meiner Frage auch erklärt, warum ich sehe, was ich mit NSURLConnection sehe.

2 Stimmen

Je nach Situation wird Ihr Objekt möglicherweise nicht zuerst zerstört, aber zumindest wird der Delegat aufgehoben. (Beispiel: UIAccelerometer)

1voto

Barry Wark Punkte 106328

Wie htw sagt, sollten Sie den Delegaten im Allgemeinen nicht beibehalten. In einer Multi-Thread-Umgebung muss man oft alles, was man braucht, behalten, selbst wenn es nur für die Dauer eines Methodenaufrufs ist, um sicherzustellen, dass es nicht hinter Ihrem Rücken ungültig gemacht wird. Wenn zum Beispiel (was eigentlich nicht der Fall ist), die -[NSURLConnection initWithRequest:delegate] einen neuen Thread erstellt hat, kann dieser Thread seine Parameter beibehalten haben (und wird sie dann wahrscheinlich automatisch wieder freigeben). In Wirklichkeit, NSURLConnection ist insofern ein Sonderfall, als er seinen Delegierten für die Dauer der Verbindung beibehält.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X