/ / Objc Cocoa MRC - Freigegebene und autorisierte ObjekteIch muss ihn aufschreiben, um die Anwendung zu sehen - Ziel-C, Metall

Objc Cocoa MRC - Freigegebene und autorisierte Objekte Ich muss ihn aufschreiben, um die Anwendung zu sehen - Ziel-C, Metall

Ich schreibe eine C ++ - Anwendung mit Metal API(Ziel C) und MRC (Manual Reference Counting). Ich habe nur sehr begrenzte Erfahrungen mit ObjC. Die meisten Metal-API-Objekte sind als Protokolle definiert und werden als Objekt erstellt, das von der C-Funktion oder einer anderen Objektmethode zurückgegeben wird (z. B. MTLDevice newBufferWithLength). Um zu wissen, wie auf diese Weise erstellte Objekte freigegeben werden, muss ich wissen, ob sie vorhanden sind setze autoreleased oder nicht (ich kann nicht nennen, dass ein freigegebenes Objekt freigegeben wird, z. B. Zählstand 1 beibehalten). Das Problem ist, dass ich keine Beschreibung in der Metal API-Dokumentation finden kann, die diese Frage beantworten würde. Ich habe nur in der Bedienungsanleitung gelesen, dass alle sogenannten Lightweight-Objekte mit Autorelease erstellt werden. Es gibt drei Beispiele für automatisch freigegebene Objekte, aber ich bin mir nicht sicher, ob ich davon ausgehen kann, dass der Rest der Objekte nicht automatisch freigegeben wird. In Kakao können viele Objekte auch ohne Allocation + Init erstellt werden, da sie von einer statischen Methode (ex NSString-String) zurückgegeben werden. Das Problem scheint also nicht nur auf Metal bezogen zu sein.

Danke für Ihre Hilfe.

Antworten:

2 für die Antwort № 1

Die übliche Objective-C-Regel ist der Bereich, in dem der Bereich erstellt wirdist auch für die Freigabe des Objekts verantwortlich. In fast allen Fällen, mit Ausnahme gut dokumentierter Ausnahmen, wird das zurückgegebene Objekt automatisch freigegeben (beide werden über den Rückgabewert oder über die Argumente ausgegeben). Richtiger ist es, wenn das Objekt immer mit +0 zurückgegeben wird Gültigkeitsbereich lokaler ZählungSie müssen es also behalten, falls nötig. Beim Lesen des Handbuchs scheint es sich bei Metal API um eines von Apples Frameworks zu handeln, daher sollte es dieser Regel folgen, sofern es nicht mit fetten Anweisungen gewarnt wird. Von C-Funktionen in Objective-C wird erwartet, dass sie sich auch so verhalten und eine Funktion in Bezug auf Ressourcenmanagement.)

Für das "Allokation-Init vs. [NSString string] "Teil: Der MRC-Code gibt entweder [NSString string] (bereits +0) oder [[[NSString alloc] init] Autorelease] zurück. Andernfalls wird die Konvention abgebrochen. Ausnahmen sind zulässig -[init] und +[new...] Methoden selbst, die +1 zurückgeben. Unter ARC gibt es keinen Unterschied zwischen Allocation-Init / string, da ARC die Konvention kennt und das Richtige tut, wobei übermäßige Retains / Releases soweit möglich optimiert werden.

Beachten Sie auch das -[retainCount] ist bedeutungslos und "schädlich", weil Sie nie wissen, wie viele Aufrechterhaltungsautorelease-Aufrufe ausgeführt wurden und welche Abrechnung der Objekt-Laufzeit auch bei Ihren eigenen Objekten wirksam ist.

ARC ist wirklich eine großartige Option, wenn Sie nichtSchreiben einer Art Objective-C-to- Welche Brücke auch immer, bei der Zählwerte und / oder Zyklen für das Zurückhalten explizit verwaltet werden müssen, weil der Kontext fehlt. Es nimmt Ihnen nichts ab und bietet in den meisten Fällen den großen Vorteil, dass Sie keine Ressourcen verwalten.