TableView Nummerierung

30/01/2010 - 13:18 von usenet | Report spam
Ich habe

/*objc*/

- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
if (DEBUGLVL >= d_dlev_verbose) NSLog(@"%@ at row index %i %@",
NSStringFromSelector(_cmd), rowIndex, [aTableColumn identifier]);
CFStringRef returnvalue = 0;
CFDictionaryRef x = [[deviceMenu selectedItem] representedObject];
CFMutableArrayRef y = CFDictionaryGetValue(x, CFSTR("y"));

if ( CFEqual( [aTableColumn identifier], CFSTR("Parameter")) )
returnvalue = CFArrayGetValueAtIndex(y, rowIndex);
else
{
unsigned char willistring[8] = "";
sprintf(willistring, "%i", rowIndex);
CFStringRef cfnumb = CFStringCreateWithCString(NULL,
willistring, kCFStringEncodingASCII);
returnvalue = cfnumb;
CFRelease(cfnumb);
}

//NSLog(@"tableview object value %@ %i %@ - %@", [aTableColumn
identifier], rowIndex, returnvalue, NSStringFromSelector(_cmd));

return returnvalue;
}

/*objc*/

in einem zweispaltigen Tableview. Die erste Spalte ist als reine
Nummerierung gedacht.

Jetzt frage ich mich ob ich diese Nummerierung nicht wesentlich
einfacher geht.

Insbesondere weil ich keine Möglichkeit sehe einen vorherigen Wert zu
releasen.

Davon auszugehen, dass es immer(tm) funktioniert einen cfstring
zurückzugeben der einen releasecount von 0 hat finde ich nicht gut. Die
Docs sagen auch nicht ob der Tableview einen retain/release durchführt
(Menus z.B. tun das).

Hado Hein (KSK, DTHG), Berlin
www.beleuchtungsbildner.de - Stage Lighting Directing
www.batchmaker.de - Stage Lighting Design, Control and Routing
 

Lesen sie die antworten

#1 Alexander Clauss
31/01/2010 - 10:42 | Warnen spam
Hado Hein wrote:
Insbesondere weil ich keine Möglichkeit sehe einen vorherigen Wert zu
releasen.



'autorelease' ist Dein Freund hier.

Davon auszugehen, dass es immer(tm) funktioniert einen cfstring
zurückzugeben der einen releasecount von 0 hat finde ich nicht gut.



Das geht auch schief.

Docs sagen auch nicht ob der Tableview einen retain/release durchführt
(Menus z.B. tun das).



Doch, die Docs sind hier durchaus eindeutig. Wenn Du ein Objekt
erzeugst, bist Du auch für die Freigabe verantwortlich. Da Du bei
Objekten, die Du über 'return' weitergibst, keine Kontrolle mehr hast,
gibt es ja in Cocoa das Konzept der AutoreleasePools. Lies Dir die
Kapitel über dieses Thema unbedingt durch, denn das ist essentiell. D.h.
Du rufst hier nicht release sondern autorelease auf.

PS: warum verwendest Du die CF-Routinen (C) anstelle der NS-Routinen
(Objective-C)? Letztere dürften hier doch wesentlich übersichtlicher
sein.


Alexander

Ähnliche fragen