Die rules für Speicherverwaltung in Core Foundation sind denen in Cocoa ähnlich: Wenn die Methode, die eine Referenz zurückgibt, die Wörter "create" oder "copy" enthält, müssen Sie die Referenz besitzen und CFRelease()
für diese Referenz aufrufen, um aufzugeben Eigentum. Andernfalls tun Sie nicht besitzen die Referenz und müssen CFRetain
aufrufen, um das Eigentum zu übernehmen (notwendigerweise eine nachfolgende CFRelease
erforderlich, um diese neue Eigentümerschaft aufzugeben). Diese Regeln, wie aus dem Memory-Management-Programmierhandbuch für Core Foundation genommen sind:
- Wenn Sie ein Objekt erstellen (entweder direkt oder durch eine Kopie macht eine anderes objekt siehe „Das Erstellen -Regel“), Es gehört dir.
- Wenn Sie ein Objekt von woanders bekommen, tun Sie nicht besitzen. Wenn Sie verhindern möchten, dass entsorgt wird, müssen Sie als Eigentümer hinzufügen (unter Verwendung von CFRetain).
- Wenn Sie ein Eigentümer eines Objekts sind, müssen Sie den Besitz auflösen, wenn Sie die Verwendung (mit CFRelease) beendet haben.
In Ihrem Beispiel müssen sowohl die addressBook
als auch die peopleArray
freigegeben sein. Da in Core Foundation kein autorelease
Äquivalent vorhanden ist, geben Sie das Array ohne zurück, wenn Sie die Referenz aus einer Methode zurückgeben. Sie sollten (sofern Sie nicht böse sind) dann "create" in den Methodennamen aufnehmen, um dem Aufrufer anzuzeigen, dass er jetzt einen Verweis auf das zurückgegebene Objekt besitzt. In diesem Fall ist CFArray gebührenfrei überbrückt zu NSCFArray
, ein Objective-C-Objekt, das von NSObject
erbt. Sie können werfen somit peopleArray
zu einem NSArray*
und autorelease
, dass, wenn Sie es von einer Funktion/Methode zurückgeben müssen:
return [(NSArray*)peopleArray autorelease];
beachten, dass dies nur funktioniert, für gebührenfreie überbrückte Klassen. Mein Verständnis ist, dass es ziemlich schwierig ist, eigene gebührenfreie gebrückte Klassen zu bilden, und nur die primitiven (String, Array, etc.) CF-Klassen sind gebührenfrei überbrückt, so dass dieser Ansatz nicht immer funktioniert. Schließlich, wenn Sie vermeiden können, autorelease
(d. H.Sie können Ihre Speicherverwaltung expliziter machen), das ist wahrscheinlich immer eine gute Sache.
Vielen Dank. Ich habe darum gekämpft, die Antwort auf Google zu finden. Wahrscheinlich, weil ich nach "Core Framework" anstatt nach "Core Foundation" gegoogelt habe. Do! :) – rein