2010-11-23 22 views
1

ich [anArray retainCount] verwendet habe die Beibehaltungszähler des Arrays zu erhalten .. (Ich weiß, das sollte nicht verwendet werden, aber ich bin mit nur Konzept Lernen behalten)behalten Zählung im iphone

Im Anschluss an meinem Code.


NSString *str = [[NSString alloc] initWithFormat:@"a,b,c,d"]; 
NSArray *anArray =[[NSArray alloc]init]; 
NSLog(@"Retain count: %i", [anArray retainCount]); 
anArray=[str componentsSeparatedByString:@","]; 
NSLog(@"Retain count: %i", [anArray retainCount]); 

Ausgang

Retain count: 2 
Retain count: 1 

ich denke, es aber umgekehrt sein sollte ....

+0

["Was erhöht die Anzahl der Retainer eines Objekts?"] (Http://stackoverflow.com/questions/1181010/what-increases-an-objects-retain-count) könnte eine Lektüre wert sein. – jensgram

+0

Entschuldigung, aber wenn ich diesen Code benutze es beide Zeit zeigen Anzahl 1 behalten. Und das ist richtig, weil nur Array-Objekt für das Array freigeben müssen – Ishu

+0

Warum die OVR-Anzahl war 2 ist jemand raten. (aber wie einige Leute erwähnen, Sie sollten nicht auf den Wert abhängen). Es könnte NSArray selbst in den Autorelease-Pool hinzugefügt werden? – seand

Antwort

7

ging zurück, dir bitte einen Gefallen tun und nicht Blick auf retainCount versuchen zu lernen, wie die Speicherverwaltung Regeln arbeiten. Siehe stattdessen den freundlichen Apple Memory Management Guide.

In Ihrem Beispiel:

NSArray *anArray =[[NSArray alloc]init]; 

Sie haben "anArray" zugewiesen (durch alloc Aufruf), so dass Sie für den Aufruf release verantwortlich sind.

Jetzt haben Sie ein neues Objekt erhalten (undleck das Original, wie gesagt). Dieses Mal besitzen Sie das Objekt nicht (weil componentsSeparatedByStringalloc oder copy in seinem Namen nicht besitzt), so dass Sie es nicht freigeben dürfen.

Mach dir keine Sorgen darüber, was der retainCount ist; tendieren Sie dazu, eigene Objekte zu stricken und freizugeben, die Objekte, die Sie nicht besitzen, freigeben sollten.

+0

+1 für das Sprechen in Bezug auf Objektbesitz, anstatt mit der antiquierten "Retain Count" Terminologie. – dreamlax

+0

meinst du folgender Code ist richtig? NSString * str = [[NSString Alloc] initWithFormat: @ "a, b, c, d"]; NSArray * anArray = [[NSArray alloc] init]; [anArray-Freisetzung]; anArray = [str componentsSeparatedByString: @ ","]; // lass das anArray jetzt nicht los – Saawan

+0

+1 es wäre +2, wenn du erwähnt hättest, dass "neu" dir auch ein Objekt gibt, das du besitzt, und ich durfte zweimal abstimmen. – JeremyP

1

Die Dokumentation besagt, dass die Zählung unwahrscheinlich ist, behalten alle nützlichen Informationen zu versorgen, . Es ist NICHT ein guter Weg, um über Retain-und Release-Konzepte zu lernen.

+0

Dies sollte ein Kommentar nicht beantworten ..... – Saawan

+0

Stellen Sie eine Frage, wenn Sie eine Antwort möchten. "Ich denke, es sollte das Gegenteil sein, aber ..." ist eine vage Implikation ... –

5

Diese Zeile ... anArray = [str componentsSeparatedByString: @ ","];

Sie haben die ursprüngliche Zuweisung von 'anArray' (wodurch ein Leck) erstellt. Im wirklichen Leben möchten Sie zuerst [anArray Release]. Deshalb ist der Beibehaltungszähler auf 1

+0

+1 für Squishing –

+0

+1 für Squishing – dreamlax

+0

+1 Dank für Ans – Saawan