2 Stimmen

wann man self.property in init-Methoden in Objective-C verwendet, wie man Arrays in init-Methoden initialisiert

Ich bin verwirrt, was die richtige Art und Weise zu schreiben, benutzerdefinierte init-Methoden für youw eigene Unterklasse in Bezug auf die Speicherverwaltung, benutzerdefinierte Unterklassen und Arrays. Wenn ich Eigenschaften wie haben:

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *array;
@property (nonatomic, retain) SomeSubclassOfNSObject *object;

@interface SomeSubclassofNSObject 
@property (nonatomic, retain) NSString *category;

Wie schreibe ich meine Init-Methode?

tun Sie das:

initWithName:(NSString *)aName object:(SomeSubclassOfNSObject *)anObject {
    if (self = [super init]) {
       self.name = aName; // or do you do name = aName or name = [aName copy] autorelease] or name = [NSString alloc] initWithFormat:@"%@", aName]
       self.object = anObject; // do I need to make a copy of this object so they don't point to the same object?

    // loop through NSMutableArray and copy the objects?
    // not really sure what to do for arrays.      
    }
    return self;
}

0voto

Kay Punkte 12468
  1. Ich würde empfehlen self.name = aName; in den meisten Fällen, da dies die Vorteile des generierten Setters nutzt und somit die Anzahl der Beibehaltungen implizit erhöht wird. Das bedeutet, dass Ihre Referenz sicher ist, unabhängig davon, ob der Aufrufer von init wird danach mit aName . Dasselbe gilt für das Gegenstück zum Dealloc: Schreiben Sie einfach self.name = nil; und Sie sind fertig.

    Anders sieht es aus, wenn Sie Folgendes liefern NSMutableString weil sich Änderungen innerhalb Ihrer Klasse auf die Verweise anderer Klassen auf diese Klasse auswirken werden. Aus Design-Sicht sollten veränderbare Strings jedoch nur dann als Parameter verwendet werden, wenn Sie beabsichtigen, sie zu manipulieren.

  2. self.object = anObject; : Nun, das hängt davon ab, was Sie wollen. Wenn alle Klassen auf das gleiche Objekt verweisen sollen, sollten Sie keine Kopie erstellen (ich denke, das ist meistens genau das, was Sie wollen). Es kann Fälle geben, in denen es sinnvoll ist, eine tiefe Kopie zu erstellen.

  3. Arrays: Sie benötigen etwas wie array = [[NSMutableArray alloc] init]; in Ihrer init-Methode. Danach wird die Retain-Anzahl automatisch für jedes Objekt, das Sie hinzufügen, erhöht, d.h. Sie müssen retain nicht für das hinzugefügte Objekt selbst aufrufen. Wie in 2. kann es Situationen geben, in denen Sie wirklich Kopien der Objekte eines Quell-Arrays haben wollen. OK, machen Sie es, aber das ist selten der Fall.

    Häufiger hat man ein bestehendes Array und möchte ein Unterarray davon oder eine spezielle sortierte Version. Sie haben also ein neues Array, aber die gleichen Elemente.

Dies war die kurze Antwort. Mehr dazu in:

Programmierhandbuch für die erweiterte Speicherverwaltung

Deklarierte Eigenschaften

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