2016-06-23 11 views
0

Ich habe einige Tests über Mannul Referenzzählung in Objective-C. Ich betreibe diesen Code unten:Viele Probleme über NSString Referenzzahl

- (void) test { 
    NSData *a1 = [[NSData alloc] init]; 
    NSLog(@"NSData: %lu", [a1 retainCount]); 

    NSMutableData *a2 = [[NSMutableData alloc] init]; 
    NSLog(@"NSMutableData: %lu", [a2 retainCount]); 

    NSObject *a3 = [[NSObject alloc] init]; 
    NSLog(@"NSObject: %lu", [a3 retainCount]); 

    NSString *b1 = [[NSString alloc] initWithFormat: @"%@", @"ok"]; 
    NSLog(@"NSString: %lu", [b1 retainCount]); 


    NSString *b2 = [[NSString alloc] initWithFormat: @"%@", a3]; 
    NSLog(@"NSStinrg: %lu", [b2 retainCount]); 


    NSString *a = @"abc"; 
    NSString *b = @"abc"; 
    NSLog(@"%p", a); 
    NSLog(@"%p", b); 

} 

Die Konsole:

2016-06-23 16:15:50.490 text[38147:3406036] NSData: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSMutableData: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSObject: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSString: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSStinrg: 1 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 

Und ich wissen wollen, warum die Referenzzahlen von NSData und NSStringUINT_MAX (-1) sind, und initWithFormat wird b2 make a hinzufügen Anzahl? Warum sind die Adressen a und b gleich?

Thx viel.

+2

[Wann muss ich -halteCount verwenden?] (Http://sdarlington.github.io) – vikingosegundo

+0

@vikingosegundo haha, du hast es vor mir geschafft. – Fogmeister

Antwort

2

Leere unveränderliche NSDatas werden auf eine einzige Instanz uniquediert, die nicht beibehalten oder freigegeben werden kann (angezeigt durch den Refcount UINT_MAX-1). Für den NSString 1 wird% @ durch das Ergebnis des Aufrufs von -description für das Objekt ersetzt, und die Methode -description von NSString gibt self zurück. Sie erhalten also dort ein konstantes NSString-Literal, das in ähnlicher Weise nicht beibehalten oder freigegeben werden kann. Konstante Zeichenfolgen werden ebenfalls uniformiert, sodass zum Zeitpunkt der Kompilierung eine einzige in Ihre Binärdatei eingebettet ist und keine Zuordnungen vorgenommen werden.

+0

Bitte nicht miteinander in Verbindung stehende Fragen spammen –

+0

Also 'a' und' b' hat in binäre ai Kompilierzeit eingebettet. Und in dieser Zeit kann Compiler "a" mit "b" vergleichen, um zu beurteilen, ob sie gleich sind? Auf diese Weise teilen sie die eine Adresse? –

+0

@Desgard_Duan: Objective-C tut viele Dinge um Speicher zu sparen. Einschließlich Objekte, bei denen der Zeiger das Objekt selbst ist. – gnasher729

2

Vom apple docs

- (NSUInteger)retainCount 

Diese Methode ist von keinem Wert in Managementfragen Speicher debuggen. Da eine beliebige Anzahl von Framework-Objekten möglicherweise ein Objekt in gespeichert hat, um Verweise darauf zu halten, während die Pools gleichzeitig eine beliebige Anzahl verzögerter Releases für ein Objekt enthalten können, ist es sehr unwahrscheinlich, dass Sie erhalten nützliche Informationen von dieser Methode.

Verwandte Themen