js' blog

OFAutoreleasePool
Created: 06.01.2009 22:40 UTC

So, objfw hat jetzt Autorelease-Pools. Das Konzept werden sicherlich einige von euch von Cocoa her kennen. Naja, jedenfalls ist das ganze viel mehr tricky gewesen, als ich dachte - u.a. weil das ganze ja pro Thread ist und weil OFArray ein void* nimmt und ich ihm ein OFObject* gegeben habe und daher der Compiler mich auch nicht gewarnt hat, daß ich da Mist mache und ein OFObject** brauche. So hat mich ein fehlendes „&“ doch einige Zeit gekostet. Zumal die Fehler interessant sind, wenn man die ersten 4 Byte (ich entwickel auf einem 32 bit System) eines Objekts in ein Array kopiert und nachher einen Pointer auf diese 4 Bytes rausholt und in ein OFObject* castet. Die Klasse des Objekts kann natürlich danach noch nach wie vor richtig bestimmt werden, weil die ja am Anfang der struct eins Objective-C Objekts ist, nur sind alle Daten des Objekts natürlich Müll. Hat mich einige Zeit gekostet, bis ich draufkam, daß da einmal Pointer nehmen und einmal dereferenzieren zu wenig war, zumal „Hm, komisch, das Objekt ist doch vom richtigen Typ. Aber alle Daten sind Müll?“. Der Compiler hat wie gesagt nix gesagt (ist ja auch richtig so, war ja ein void*) und es schien ja, als ob man das richtige Objekt bekommen hat, wenn man ein [obj name] gesendet hat, von daher geht man nicht davon aus, daß man garnicht das Objekt hat, das man denkt zu haben. Ansonsten ist die Sache eigentlich doch ziemlich trivial. Es sind nur immer diese kleinen, unscheinbaren Fehler, die einen ewig aufhalten.

Anyway, für den OFAutoreleasePool-Test ist mir dann nachher noch was ziemlich cooles eingefallen, um da ein wenig Debug-Output zu bekommen. Man will ja schließlich sehen, ob richtig retained und released wurde. Jedenfalls: Wer mal sehen möchte, warum Objective-C einfach nur cool ist, der gucke sich das hier an ;).