5 Stimmen

Objective C NSString* Eigenschaft behalten Zählung oddity

Ich habe die folgende Beispielklasse:

Test.h:

@interface Test : UIButton {
    NSString *value;
}
- (id)initWithValue:(NSString *)newValue;
@property(copy) NSString *value;

Test.m:

@implementation Test
@synthesize value;
- (id)initWithValue:(NSString *)newValue {
    [super init];   
    NSLog(@"before nil value has retain count of %d", [value retainCount]);
    value = nil;
    NSLog(@"on nil value has retain count of %d", [value retainCount]);
    value = newValue;
    NSLog(@"after init value has retain count of %d", [value retainCount]);
    return self;
}

Das Ergebnis ist die folgende Ausgabe:

2008-12-31 09:31:41.755 Concentration[18604:20b] before nil value has retain count of 0
2008-12-31 09:31:41.756 Concentration[18604:20b] on nil value has retain count of 0
2008-12-31 09:31:41.757 Concentration[18604:20b] after init value has retain count of 2147483647

Ich nenne es so:

Test *test = [[Test alloc] initWithValue:@"some text"];

Sollte der Wert nicht eine Beibehaltungszahl von 1 haben? Was übersehe ich?

Vielen Dank für Ihre Hilfe.

2voto

Sie sollten nicht auf die Retain-Zahlen achten, sondern einfach die Regeln der Cocoa-Speicherverwaltung befolgen. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

0voto

Hmm wir kommen der Sache näher.

scheint es, dass die Anzahl der beibehaltenen Werte von newValue ebenfalls 2147483647 beträgt.

Ich habe versucht, die Zeichenkette stattdessen dynamisch zuzuweisen, was zu den gleichen Ergebnissen bei der Beibehaltung der Anzahl führte.

Ich habe hier einen hilfreichen Artikel gefunden: http://www.cocoadev.com/index.pl?NSString

FTA:

Muss der von @"" zurückgegebene NSString freigegeben werden, oder wird er automatisch freigegeben? Weder noch. @""-Strings sind von der Klasse NSConstantString? und verhalten sich daher wie Atome in Lisp; sie hängen herum. Das heißt, wenn Sie @"cow" an zwei verschiedenen Stellen in Ihrem Code verwenden, verweisen sie auf dasselbe Objekt. Ich glaube nicht, dass -release oder -autorelease irgendetwas mit einem von ihnen macht.

Wenn ich die Eigenschaft "copy" habe, sollte sie dann nicht den Inhalt des Zielspeichers in einen neuen Speicher mit einer Retain Count von 1 kopieren? Es scheint, dass das Attribut "copy" in diesem Fall nichts bewirkt?

0 Stimmen

Das ist mein Verständnis: Wenn Sie ein unveränderliches Objekt "kopieren", behalten Sie es eigentlich nur bei. Doing eine Kopie einer veränderlichen Zeichenfolge (oder andere veränderliche Objekt) tatsächlich kopiert es. Versteifen Sie sich nicht zu sehr auf die ganze retainCount Sache. Wenn Sie jede Zuweisung mit der Freigabe ausgleichen, werden Sie gut zurechtkommen.

0voto

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    char *cstr = "this is a c string";

    NSString *str = [[NSString alloc] initWithUTF8String:cstr];
    NSLog(@"rc1: %d", [str retainCount]);

    [pool drain];
    return 0;
}

Wenn Sie den obigen Code ausführen, wird die Anzahl der zurückgehaltenen Daten mit 1 angegeben.

0voto

dreamlax Punkte 91447

In Cocoa bleiben viele unveränderliche Objekte einfach erhalten, wenn Sie eine Kopie innerhalb der gleichen Zone anfordern. Wenn das Objekt garantiert nicht verändert wird (d.h. seine Unveränderlichkeit), ist ein exaktes Duplikat überflüssig.

In Objective-C ist die Klasse der konstanten Zeichenketten getrennt von Cocoa's NSString Klasse, auch wenn es sich um eine Unterklasse von NSString (Ich bin mir nicht ganz sicher). Diese konstante Stringklasse kann überschreiben NSObject Methoden wie retain , release y dealloc so dass sie nichts bewirken, und setzen auch die retainCount so dass sie immer dieselbe Zahl zurückgibt, UINT_MAX oder so. Der Grund dafür ist, dass eine Objective-C-Konstante im statischen Speicher erstellt wird. Sie muss das allgemeine Verhalten eines Cocoa-Objekts haben (bei Verwendung von Cocoa), so dass sie zu Arrays hinzugefügt werden kann, als Schlüssel in einem Wörterbuch verwendet werden kann usw., außer in Bezug auf die Speicherverwaltung, da sie anders zugeordnet wurde.

Haftungsausschluss: Ich weiß eigentlich nicht, wovon ich rede.

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