2 Stimmen

Verwendung von __attribute__'s in ARC-verwaltetem Code

Als ARC zu Objective-C kam, tat ich mein Bestes, um mich durch die Automatische Referenzzählung in Objective-C (ARC) Anleitung auf der Website des Clang-Projekts, um zu verstehen, worum es dabei geht. Was ich dort (und nirgendwo sonst) fand, war die Erwähnung der Verwendung von __attribute__ Deklarationen, um ARC mitzuteilen, ob ein bestimmter Code seinen Rückgabewert automatisch freigibt, zum Beispiel ( __attribute__((ns_returns_autoreleased)) ), oder ob er einen Parameter 'verbraucht' ( __attribute((ns_consumed)) , und so weiter.

Allerdings scheint der Leitfaden nur sehr wenig über den tatsächlichen Grad der Notwendigkeit dieser Erklärungen zu sagen. Ihr Ausschluss scheint keinen Unterschied zu machen, weder beim Ausführen des statischen Analysators noch beim Ausführen des Projekts selbst. Machen sie überhaupt einen Unterschied? Gibt es irgendeinen Vorteil, eine Methode zu kennzeichnen mit __attribute__((objc_method_family(new))) ? In keinem Artikel, den ich über ARC gefunden habe, werden diese Spezifizierer überhaupt erwähnt; vielleicht kann ein ARC-Guru Auskunft darüber geben, wofür sie verwendet werden.

(Ich persönlich schließe alle relevanten Spezifizierer nur für den Fall ein, finde aber, dass sie den Code verworren und unübersichtlich machen).

5voto

Peter Hosey Punkte 94684

Diese Attribute sind ausdrücklich für außergewöhnliche Fälle vorgesehen, wie z. B.:

Ein Funktions- oder Methodenparameter vom Typ "retainable object pointer" kann als "consumed" markiert werden, was bedeutet, dass der Aufrufende erwartet, den Besitz eines +1 retain count zu übernehmen.

Eine Funktion oder Methode, die einen Retainable-Objektzeiger zurückgibt, kann als Rückgabe eines Retain-Wertes markiert werden, was bedeutet, dass der Aufrufer erwartet, den Besitz einer +1 Retain-Zahl zu übernehmen.

Sie tun diese Dinge normalerweise nicht, also verwenden Sie diese Attribute normalerweise nicht. Ohne Attribute ist das normale Verhalten - die NARC-Regel, oder vielleicht sollte ich unter ARC CAN sagen - das, was der Compiler implementiert und erwartet.

Es gibt zwei Gründe für die Verwendung dieser Attribute:

  • Um die CAN-Regel zu verletzen, d.h. um eine nicht so benannte Methode zu haben, die eine Referenz zurückgibt, oder eine so benannte Methode, die keine zurückgibt. Das Attribut dokumentiert die Verletzung im Prototyp der Methode und kann sogar notwendig sein, um sie zu implementieren, wenn die Implementierung ARC verwendet.
  • Arbeiten mit Core Foundation-Typen, einschließlich Core Graphics-Typen. Diese sind nicht ARCed, so dass Sie die Überbrückungsattribute verwenden müssen, um die Konvertierung in und aus "retainable object pointer"-Typen zu unterstützen.

3voto

AliSoftware Punkte 32525

Das ist in den meisten Fällen nicht notwendig, da LLVM und Clang die ObjC-Namenskonventionen kennen. Wenn Sie also den Standard-Namenskonventionen von Cocoa folgen, nimmt LLVM automatisch die entsprechende Familie/Rückgabespeicher-Politik an, der Sie folgen müssen.

Wenn Sie nämlich eine Methode namens initWith... wird sie automatisch als die "init"-Methodenfamilie betrachtet, ohne dass sie angegeben werden muss __attribute__((objc_method_family(init))) wird es von Clang automatisch erkannt; dasselbe gilt für die new Familie, usw.

Tatsächlich müssen Sie nur die __attribute__ Spezifizierer, wenn Clang solche Fälle nicht erraten kann, was in der Praxis selten vorkommt (in der Praxis musste ich es nie benutzen), oder nur, wenn Sie Namenskonventionen nicht beachten:


Zitat Dokumentation der Clang-Spracherweiterungen :

Viele Methoden in Objective-C haben konventionelle Bedeutungen, die durch ihre Selektoren bestimmt werden. Für die Zwecke der statischen Analyse ist es manchmal nützlich, eine Methode zu markieren als die eine bestimmte konventionelle Bedeutung haben, obwohl sie nicht den richtigen Selektor haben oder nicht die konventionelle Bedeutung hat, die der Selektor vermuten lässt. Für diese Anwendungsfälle stellen wir ein Attribut zur Verfügung, das speziell die Methodenfamilie beschreibt, zu der eine Methode gehört.

Sobald Sie also die Namenskonventionen einhalten (was Sie immer tun sollten), werden Sie nichts mehr zu tun haben.

0voto

justin Punkte 103032

Sie sollten sich auf jeden Fall an Namenskonventionen halten, wo immer dies möglich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X