6 Stimmen

Automatische iVars mit @synthesize

Ich verstehe, dass beginnend mit iOS 4, gibt es jetzt die Möglichkeit, nicht deklarieren iVars überhaupt, und lassen Sie den Compiler automatisch erstellen sie für Sie, wenn Sie die Eigenschaft zu synthetisieren. Ich kann jedoch keine Dokumentation von Apple zu dieser Funktion finden.

Gibt es außerdem eine Dokumentation über bewährte Verfahren oder von Apple empfohlene Richtlinien zur Verwendung von iVars und Eigenschaften? Ich habe immer Eigenschaften wie diese verwendet:

.h-Datei

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m-Datei

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end

Ich verwende _indexPath anstelle von indexPath als meinen iVar-Namen, um sicherzustellen, dass ich niemals indexPath wenn ich Folgendes verwenden muss self.indexPath . Aber jetzt, wo iOS automatische Eigenschaften unterstützt, muss ich mir darüber keine Gedanken mehr machen. Allerdings, wenn ich die iVar-Deklaration weglassen, wie sollte ich es in meinem dealloc freigeben behandeln? Mir wurde beigebracht, iVars beim Freigeben in dealloc direkt zu verwenden, anstatt die Eigenschaftsmethoden zu benutzen. Wenn ich zur Entwurfszeit keinen iVar habe, kann ich stattdessen einfach die Eigenschaftsmethode aufrufen?

6voto

Joshua Weinberg Punkte 28440

Ich habe viele verschiedene Möglichkeiten ausprobiert, damit umzugehen. Meine derzeitige Methode ist es, die Eigenschaft Zugriff in dealloc verwenden. Die Gründe nicht zu sind zu konstruiert (in meinem Kopf), um es nicht zu tun, außer in Fällen, wo ich weiß, die Eigenschaft hat seltsames Verhalten.

@interface Class
@property (nonatomic, retain) id prop;
@end

@implementation Class
@synthesize prop;

- (void)dealloc;
{
    self.prop = nil;
    //[prop release], prop=nil; works as well, even without doing an explicit iVar
    [super dealloc];
}
@end

5voto

Mark Grimes Punkte 116

Im Gegensatz dazu tue ich Folgendes:

@interface SomeViewController : UIViewController

@property (nonatomic, copy) NSString *someString;

@end

y luego

@implementation SomeViewController

@synthesize someString;

- (void)dealloc
{
    [someString release], someString = nil;
    self.someString = nil; // Needed?

    [super dealloc];
}

@end

Hinweis: Irgendwann wird Apple Synthesize-by-default aktivieren, wodurch die @synthesize-Direktive nicht mehr erforderlich sein wird.

3voto

Martin Babacaev Punkte 6140

Sie können direkt auf Instanzvariablen zugreifen, indem Sie -> Symbol anstelle des Punktes . (wodurch die entsprechende Accessor-Methode von ivar aufgerufen wird):

.h

@interface myClass {
}
@property(nonatomic, retain) NSIndexPath *indexPath

@end

.m

@implementation myClass

- (void)dealloc {
    [self->indexPath release];
    self->indexPath = nil; // optional, if you need it

    [super dealloc];
}
@end

So erhalten Sie direkten Zugang zu iVar und nicht die entsprechende Accessor-Methode, wodurch ein zusätzlicher Vorteil erzielt wird - die Leistung.

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