Objective-c: Warum Core Foundation-Variablen explizite Freigabe in ARC benötigen?

8

Wenn ich an ARC denke, gibt es keinen Overhead für die Veröffentlichung. Aber sobald die Core Foundation Variablen gefunden wurden, müssen sie auch in ARC veröffentlicht werden.

Obwohl die ARC-Regeln sowohl für NS.. als auch für CF.. unterschiedlich sind, gibt es einen bestimmten Grund dafür, CF.. nicht in ARC zu unterstützen?

    
preetam 24.09.2014, 09:33
quelle

2 Antworten

12
  

Wenn ich an ARC denke, gibt es keinen Overhead für die Veröffentlichung.

Ich nehme an, du meinst "Ich muss mir keine Sorgen wegen der Freilassung machen." Es gibt oft einen Leistungsaufwand, obwohl der Compiler es manchmal optimieren kann.

  

Obwohl die ARC-Regeln sowohl für NS .. als auch für CF .. unterschiedlich sind, gibt es irgendeinen spezifischen Grund, CF in ARC nicht zu unterstützen?

Viele Core Foundation-Objekte werden von ARC verwaltet, und ihre Anzahl nimmt ständig zu. Sie können feststellen, ob eine bestimmte Funktion ARC unterstützt, indem Sie in der Kopfzeile nach CF_IMPLICIT_BRIDGING_ENABLED suchen. Wenn Sie das sehen, geben die Funktionen ARC-kompatible CF-Objekte zurück. In iOS 8 wurden beispielsweise viele Core Graphics-Funktionen zur Liste hinzugefügt. (Ich möchte das nicht überbewerten; ich sage nicht, dass Sie heute nicht %% %%%%%%%%%%%% an diesen Punkten haben. Ich sage, dass sie von ARC verwaltet werden, sie werden von ARC in Swift verwaltet und sie können eventuell direkt in ObjC behandelt werden, ohne dass CFRelease benötigt wird.)

Der Grund, warum CF-Objekte nicht standardmäßig verwaltet werden, ist, dass jemand durchgehen und überprüfen (prüfen) muss, dass jede Funktion den Regeln zum Erstellen von Regeln entspricht oder dass sie korrekt mit Anmerkungen versehen sind Ausnahmen. Das ist ziemlich mühsam, und Apple hat es über mehrere Releases verbreitet. Aber Sie sollten sehen, dass dies mit der Zeit immer besser wird.

Kazuki hat Recht, dass Sie ARC-verwaltete Objekte nicht in eine Struktur oder eine Union einfügen können, aber dies wirkt sich normalerweise nicht auf Core Foundation aus.

BTW, CFRelease ist nur ein Wrapper um das CF_IMPLICIT_BRIDGING_ENABLED clang Pragma. Dies wird in den ARC-Dokumenten erklärt, 7.8.1 Auditing von C-retainable pointer Schnittstellen .

    
Rob Napier 24.09.2014, 22:29
quelle
7

Core Foundation ist eine reine C-Bibliothek . Daher gibt es zumindest einen Grund, warum ARC das Core Foundation-Objekt nicht direkt unterstützen kann.

Ссылка

  

4.3.5 Eigner-qualifizierte Felder von Strukturen und Vereinigungen

     

Ein Programm ist schlecht gebildet, wenn es ein Mitglied einer C-Struktur oder -Union mit einem nicht-trivial Eigentumsrecht-qualifizierten Typ deklariert.

     

Begründung

     

Der resultierende Typ würde im C ++ Sinn nicht-POD sein, aber C gibt nicht   uns sehr gute Sprachwerkzeuge für das Management der Lebensdauer von Aggregaten, so   es ist bequemer, sie einfach zu verbieten. Es ist immer noch möglich   Verwalten Sie dies mit einem void * - oder einem __unsafe_unreasted-Objekt.

Daher kann der LLVM-Compiler aufgrund von C does not give us very good language tools for managing the lifetime of aggregates nicht die Lebensdauer von Core Foundation-Objekten in Strukturen und Unionen sowie diese Erklärung verarbeiten.

    
Kazuki Sakamoto 24.09.2014 18:31
quelle