Ich habe zweifellos, dass das automatische Bezugszählen (KREISBOGEN) der folgende große Sprung vorwärts für das Ziel-C seit der Einführung des Ziels-C 2.0 ist. KREISBOGEN erlaubt Ihnen, die Last des Speichermanagements auf (Apple LLVM 3.0) zu stellen, Bearbeiter, und nie zu denken behält, veröffentlicht und autoveröffentlicht jemals wieder.

Da erste Erfahrungen vielen Benutzers mit dem KREISBOGEN versuchen werden, einen vorhandenen app umzuwandeln, werden sie den harten Weg erfahren, wie das Umwandeln vorhandenen Codes, um ZU FUNKEN, nicht ein Feuer ist & vergessen Sie Operation. Und da das das Internet ist, gibt es auch viele Annahmen, falsche Angaben und andere Mythen, der, die um den KREISBOGEN kreisen ringsherum geht.

So ist hier so etwa alles, was Sie über den KREISBOGEN, und einen KREISBOGEN-MYTHBUSTING auch wissen müssen.

Entwicklungsvoraussetzungen für den KREISBOGEN apps

  • Xcode 4.2
  • Bearbeiter des Apple LLVM 3.0 (Bauen Einstellung)
  • EIN/AUSGABE-STEUERSYSTEM app Entwicklung: Schnee-Leopard 10.6 und neuer
  • Mac app Entwicklung: Löwe 10.7 und neuer

Es gibt keine KREISBOGEN-Entwicklung für Mac apps unter dem Schnee-Leoparden! Und Xcode 4.1 und kommt früher gestopft mit dem Bearbeiter des Apple LLVM 3.0 (Klappern) nicht, das die erste Klappern-Bearbeiter-Version ist, um KREISBOGEN zu unterstützen.

Minimale Aufstellungsziele für den KREISBOGEN apps

  • EIN/AUSGABE-STEUERSYSTEM-Geräte: EIN/AUSGABE-STEUERSYSTEM 4.0 oder neuer
  • Mac Computer: Mac mit 64-Bit-Verarbeiter, der Schnee-Leoparden 10.6 oder neuer führt.

Mac OS X apps mit dem KREISBOGEN ermöglichte sind immer 64 Bit apps. Sie können nicht 32-Bit-KREISBOGEN apps bauen.

Macs mit mindestens einer 2 Kernduett-Zentraleinheit wird im Stande sein, 64 Bit apps zu führen. Macs mit dem 32-Bit-Kernduett oder Kernsolo (Yonah) Zentraleinheiten kann nicht KREISBOGEN apps führen. Die 32-Bit-Macs sind in der Nähe vom Ende von 2006, mit Ausnahme vom Kernduett Mini-Mac unterbrochen worden, der im August 2007 unterbrochen wurde. The 32-Bit Macs have been discontinued near the end of 2006, with the exception of the Core Duo Mac mini which was discontinued in August 2007.

Erforderliche Aufstellungsziele mit zeroing schwachen Verweisungen

  • EIN/AUSGABE-STEUERSYSTEM-Geräte: EIN/AUSGABE-STEUERSYSTEM 5.0 oder neuer
  • Mac Computer: Löwe 10.7 oder neuer.

Sie können nicht zeroing schwache Verweisungen "zufällig" verwenden, ohne es zu bemerken. Sie werden entweder das @property Schlüsselwort schwach oder __ schwaches Schlüsselwort verwenden müssen, indem Sie eine Variable erklären werden. Wenn Sie eines dieser Schlüsselwörter verwenden, wird der Bearbeiter einen Fehler erzeugen, wenn Sie das Aufstellungsziel entsprechend entweder zum EIN/AUSGABE-STEUERSYSTEM 5.0 oder zu Mac OS X 10.7 nicht noch gesetzt haben. If you use one of these keywords, the compiler will generate an error if you haven’t yet set the deployment target accordingly to either iOS 5.0 or Mac OS X 10.7.

Alle Macs fähig zum laufenden Löwen 10.7 können 64-Bit-KREISBOGEN apps führen. Löwe ist der erste 64-bit-only Mac OS X Betriebssystem.

Wie man KREISBOGEN in Ihrem Projekt ermöglicht

Sie werden sicherstellen müssen, dass die Bauen Einstellung für den Bearbeiter für C/C ++/Objective-C auf den Bearbeiter des Apple LLVM 3.0 gesetzt wird.

Das ist für vorhandene Projekte besonders wichtig, die noch veranlasst werden können, LLVM GCC 4.2 oder einen anderen Bearbeiter zu verwenden. Wenn Sie den LLVM 3.0 Bearbeiter nicht auswählen, bezog sich keiner des KREISBOGENS Einstellungen werden in der Bauen Einstellungsliste auftauchen.

Mit LLVM 3.0 ausgewählt als Bearbeiter kann die Bauen Untergehende Objektive-C Automatische zählende Verweisung auf JA gesetzt werden. Wenn Sie ein neues Projekt von einer Xcode Schablone schaffen, werden Sie auch die Auswahl haben, KREISBOGEN im neuen Projektzauberer zu ermöglichen, indem Sie Gebrauch Automatische zählende Verweisung auswählen werden.

Kompilieren Sie Fehler nach der Schaltung zu LLVM 3.0

Wenn Sie vorher einen verschiedenen Bearbeiter verwendeten, ist es absolut möglich, dass LLVM 3.0 neue Warnungen und Fehler erzeugen wird, wo es niemanden vorher sogar mit dem arbeitsunfähigen KREISBOGEN gab. Das ist der LLVM 3.0 Bearbeiter, der ein wenig besser im Ermitteln potenziell gefährlichen Codes wurde.

Ich empfehle, zuerst Ihren app mit LLVM zu bauen, den 3.0 Bearbeiter und KREISBOGEN unbrauchbar machten, um sich der ganze LLVM zu überzeugen, sind 3.0 zusammenhängende Probleme vor dem Versuchen befestigt worden, Ihren Code umzuwandeln, um ZU FUNKEN.

Zum Beispiel ist LLVM 3.0 jetzt im Stande, eine potenzielle "Reihe aus" Probleme dank des SAFECode-Projektes zu entdecken, und es nörgelt ein bisschen mehr, wenn es zum Gussteil eines Typs zu einem anderen kommt, der insbesondere mit Format-Schnuren verbunden ist. Die meisten dieser Probleme sind leicht sich aufzulösen. Tatsächlich hilft LLVM 3.0 Ihnen zu bestimmen, wo das Problem durch die ausdrucksvolle Diagnostik ist, aber leider verbirgt Xcode das ziemlich gut vor dem Benutzer. In fact, LLVM 3.0 helps you determine where the issue is through expressive diagnostics, but unfortunately Xcode hides that pretty well from the user.

Um ausdrucksvolle Diagnostik in Xcode zu sehen, gehen Sie dem Klotz-Navigator (Command+7) und wählen Sie den neusten Klotz mit der Warnung oder dem Fehler darin aus:

Dann klicken Sie auf den Detail-Knopf rechts vom Symbol der Warnung/Fehlers (gerade über "mehr" Verbindung), um den LLVM 3.0 ausdrucksvolle Diagnostik-Behauptung zu sehen, genau zum Charakter oder der Reihe von Charakteren hinweisend, die das Problem verursachen:

Das Bekommen von Drittbibliotheken, mit dem KREISBOGEN zu bauen

Das erste Ding, mit unvereinbaren Drittbibliotheken zu tun, soll sie als eine getrennte statische Bibliothek bauen. Nehmen Sie zum Beispiel Cocos2D, dessen Xcode-Projektschablone einfach den ganzen Cocos2D-Code ins Ziel Ihres Projektes stellt. Es würde ein Albtraum sein, um den kompletten Cocos2D Bibliothekscode zu versuchen und zu aktualisieren, um KREISBOGEN zu unterstützen. Während Sie KREISBOGEN für individuelle Quellcodedateien mit der-fno-objc-arc Bearbeiter-Fahne unbrauchbar machen können, würde es langweilig sein, um so für mehr zu tun, als gerade einige Dateien. It would be a nightmare to try and update the entire Cocos2D library code to support ARC. While you can disable ARC for individual source code files with the -fno-objc-arc compiler flag, it would be tedious to do so for more than just a few files.

Sobald Sie den Cocos2D Quellcode getrennt als eine statische Bibliothek bauen, werden die erforderlichen Änderungen auf drei Plätze beschränkt: CCDirector (entfernen NSAutoreleasePool), CCActionManager (tragen __ unsafe_unretained bei), und CCArray (tragen __ unsafe_unretained, Wiederfaktor Reihencode in die Durchführungsdatei bei). Winziger Tim Games hat diese Änderungen entworfen und stellt eine Gabel des Cocos2d-I-Phones zur Verfügung, das mit dem KREISBOGEN - wenn gebaut, als eine statische Bibliothek vereinbar ist.Tiny Tim Games have outlined these changes and provide a fork of cocos2d-iphone that is compatible with ARC – if built as a static library.

Übrigens ist Kobold2D mit dem KREISBOGEN völlig vereinbar. Tatsächlich hat es KREISBOGEN ermöglicht standardmäßig in allen Projekten, indem es voll umgekehrt Vereinbarkeit behält, wenn Sie KREISBOGEN nicht verwenden wollen!

Wenn das Bauen einer statischen Bibliothek noch zu viele Probleme mit dieser Bibliothek verursacht, dann gehen Sie zum Forum dieser Bibliothek, suchen Sie nach verwandten Posten des KREISBOGENS und/oder Bitte-KREISBOGEN-Unterstützung. Viele offene Quellbibliotheken kompilieren sauber mit LLVM 3.0 noch ganz zu schweigen vom Unterstützungs-KREISBOGEN nicht sogar. Das muss sich schnell ändern, weil Bibliotheksentwickler-Unterstützung direkt die Adoptionsrate des KREISBOGENS beeinflusst. This needs to change quickly because library developer support directly influences the adoption rate of ARC.

Das Umwandeln eines vorhandenen app, um ZU FUNKEN

Es gibt einen app dafür!

So, um genau zu sein, gibt es eine Menüauswahl in Xcode 4.2 dafür. Sie werden es finden, wenn Sie Ihr Projekt in Xcode öffnen und wählen, Editieren-> Wiederfaktor-> Bekehrter zum Objektiven-C KREISBOGEN.

Ihnen wird eine Liste von Zielen geboten, die Sie umwandeln wollen. Stellen Sie sicher, dass Sie keine statische Bibliothek auswählen, die Sie selbst nicht geschrieben haben. Statische Bibliotheken können mit einem Kreisbogen-ermöglichten app verbunden werden, ohne wirklich vereinbarer KREISBOGEN sein zu müssen. Obwohl Sie einige Änderungen mit den Kopfball-Dateien der Bibliothek können vornehmen müssen. Mehr darauf später. Static libraries can be linked to an ARC-enabled app without actually having to be ARC compatible. Although you may have to make some changes to the library’s header files. More on that later.

"Kann Sich nicht zum Objektiven-C KREISBOGEN Umwandeln"

Oh lieb!

In einigen Fällen ist automatische Konvertierung nicht ebenso automatisch, wie Sie hoffen würden, dass es sein würde. In vielen Fällen ist das wegen unvereinbarer statischer Bibliotheken.

In meisten umgibt die Probleme sind allein mit id oder anderen Zeigestock-Typen verbunden, die in einem C struct, vorübergehenden Zeigestöcken zu und von C/C ++ versorgt sind, Code oder der Gebrauch der NSAutoreleasePool Klasse, die nicht verfügbar ist, einen app mit dem KREISBOGEN bauend, ermöglichten. Lesen Sie auf für Lösungen zu den allgemeinsten Problemen.

Befestigen von Zeigestock-Typen in C structs

KREISBOGEN wird sich über einen C struct beklagen, der Zeigestock-Typen versorgt:

typedef struct {
  id someObject;
  void* somePointer;
  SomeClass* someClassInstance;
} someStruct;

Das ist leicht genug, durch prepending die Zeigestock-Typen mit __ unsafe_unretained Schlüsselwort zu befestigen:

typedef struct {
  __ unsafe_unretained id someObject;
  __ unsafe_unretained void* somePointer;
  __ unsafe_unretained SomeClass* someClassInstance;
} someStruct;

Das sagt KREISBOGEN, dass das Gedächtnis für diese Zeigestock-Typen manuell geführt wird, d. h. der Alt-Schulweg. Künftig wird der Zeigestock-Typ durch den KREISBOGEN "unbehalten", und es ist "unsicher", weil das Gedächtnis deallocated sein kann, aber der Zeigestock wird auf die Null automatisch nicht gesetzt, die vielleicht einen baumelnden Zeigestock schaffen kann. Es ist der Weg, wie es die ganze Zeit gewesen ist, will KREISBOGEN gerade, dass Sie ausdrücklich zugeben, dass Sie etwas tun, was unsicher betrachtet wird. Henceforth the pointer type is “unretained” by ARC, and it is “unsafe” because the memory may be deallocated but the pointer isn’t set to nil automatically, which can possibly create a dangling pointer. That’s the way it has been all the time, ARC just wants you to expressly admit that you’re doing something that is considered unsafe.

Wenn Ihr Code fein vorher arbeitete, __ wird unsafe_unretained einfach sicherstellen, dass es unter dem KREISBOGEN kompiliert. Aber für den neuen Code sollten Sie vermeiden, dieses Schlüsselwort verwenden zu müssen. Eine Auswahl ist, den ganzen C structs in Objektive-C Leichtgewichtsklassen mit Eigenschaften zu ändern. One option is to change all C structs into lightweight Objective-C classes with properties.

C/C ++ befestigend, wechselt Zeigestock mit überbrückten Würfen über

In Fällen, wo Sie id oder Gegenstand-Zeigestöcke zu und von C/C ++ Code passieren, wird sich der Bearbeiter über die Konvertierung beklagen und einen überbrückten Wurf andeuten:

//Das Zuweisen der Elfe zu Box2D userdata
b2BodyDef bodyDef;
bodyDef.userData = aSprite; //FEHLER!  // ERROR!
 
//Das Bekommen der userdata Elfe von Box2D
CCSprite* Elfe = (CCSprite *) Körper-> GetUserData (); //FEHLER!CCSprite*)body->GetUserData();  // ERROR!

Wieder ist das leicht zu befestigen, den Zeigestock-Typ und prepending es mit __ Brücke-Schlüsselwort richtig werfend:

//Das Zuweisen der Elfe zu Box2D userdata
b2BodyDef bodyDef;
bodyDef.userData = (__ überbrücken Leere *), aSprite;__bridge void*)aSprite;
 
//Das Bekommen der userdata Elfe von Box2D
CCSprite* Elfe = (__ überbrücken CCSprite *), Körper-> GetUserData ();__bridge CCSprite*)body->GetUserData();

__ bedeutet Brücke-Schlüsselwort einfach, dass der Zeigestock von oder bis Objektives-C unverändertes Land übertragen wird. KREISBOGEN wird weder behalten noch diesen Zeigestock veröffentlichen.

Die speziellen Schlüsselwörter __ bridge_transfer und __ bridge_retain sollten nur verwendet werden, wenn, sich mit gebührenfreien überbrückten Kernfundament-Gegenständen befassend, wo Sie normalerweise CFRetain und/oder CFRelease würden nennen müssen, um die Kernfundament-Gegenstand-Lebenszeit zu führen.

Befestigen von NSAutoreleasePool mit @autoreleasepool

KREISBOGEN ersetzte die NSAutoreleasePool Klasse durch die @autoreleasepool Bearbeiter-Direktive.

Sie müssen Code ersetzen, NSAutoreleasePool verwendend:

NSAutoreleasePool* bilden = [[NSAutoreleasePool alloc] init] ein Kartell;[NSAutoreleasePool alloc] init];
//schaffen Sie einige vorläufige Gegenstände hier …
[vereinen Sie Ausgabe];
bilden Sie = Null ein Kartell;

Mit dem @autoreleasepool Schlüsselwort:

@autoreleasepool
{
  //schaffen Sie einige vorläufige Gegenstände hier …
}

Methoden können Sie nicht nennen (oder überreiten) mehr

Sie werden alle Anrufe zu diesen Methoden ohne Ersatz entfernen müssen:

  • behalten
  • retainCount
  • Ausgabe
  • Autoausgabe
  • dealloc

Sie können nicht auch das behalten Schlüsselwort mit Eigenschaften mehr verwenden. Verwenden Sie statt dessen das starke Schlüsselwort.

Sie können diese Methoden in Ihrer Klasse nicht mehr überreiten:

  • behalten
  • retainCount
  • Ausgabe
  • Autoausgabe

Sie können noch - (Leere) dealloc {} überreiten

Sie können nicht dealloc nennen, aber Sie können noch - (Leere) dealloc {} Methode überreiten. Das ist nützlich, um das Gedächtnis von C/C ++ Gegenstände zu veröffentlichen. Zum Beispiel müssen Sie noch im Stande sein, das Gedächtnis eines Box2D Weltbeispiels zu befreien. Ähnlich gibt es Beispiele, wohin Sie selbst als der Delegierte einer anderen Klasse umziehen müssen, wenn selbst Klasse deallocated ist. For example you still need to be able to free the memory of a Box2D world instance. Similarly there are instances where you need to remove self as the delegate of another class when the self class is deallocated.

Es gibt eine besondere Gewohnheit, die Sie lassen müssen, gehen davon. Da Sie dealloc nicht nennen können, müssen Sie nicht auch [super dealloc] rufen. Der Bearbeiter wird [super dealloc] erzeugen rufen hinter den Kulissen automatisch. The compiler will generate the [super dealloc] call behind the scenes automatically.

Eigentumsnamengeben-Beschränkung

Sie können nicht ein Eigentum schaffen, dessen Name mit "neu" beginnt. Es ist alles.

Neue Eigentumsschlüsselwörter: stark und schwach

Das @property starke Schlüsselwort ist synonymisch, um zu behalten:

//Synonym für: @property (behalten) MyClass *myObject;
@property (starker) MyClass *myObject;myObject;

Wohingegen schwach ähnlich ist, um zuzuteilen, außer dass ein schwaches Eigentum auf die Null automatisch gesetzt wird, wenn der Gegenstand deallocated ist (folglich: zeroing schwache Verweisung):

//ähnlich "@property (teilen) MyClass *myObject (zu);"
@property (schwacher) MyClass *myObject;myObject;

Zeroing schwache Verweisungen sind nur verfügbar, EIN/AUSGABE-STEUERSYSTEM 5.0 und neuer, oder Mac OS X Löwe 10.7 und neuer ins Visier nehmend.

KREISBOGEN verbietet das Synthetisieren eines Read-Only-Eigentums ohne Eigentumsrecht-Qualifikator

Normalerweise, wenn Sie ein Read-Only-Eigentum erklären, ist es egal, was der Lagerungstyp ist (behalten Sie, teilen Sie Kopie zu), da Read-Only-Eigenschaften dem nicht zugeteilt werden können. Nehmen Sie diesen zum Beispiel:

@property (nichtatomar, read-only-) MyView* myViewController; myViewController;

Jetzt mit dem KREISBOGEN, wenn Sie den ivar manuell nicht erklären (@synthesize kann ivars erzeugen), werden Sie auf einen fremden Fehler auf der @synthesize Linie stoßen, festsetzend:

Fehler: KREISBOGEN verbietet das Synthetisieren eines Eigentums eines Objektiven-C Gegenstands mit dem unangegebenen Eigentumsrecht oder Lagerungsattribut [4]

Ebenso sonderbar, wie es in diesem Fall scheinen kann, werden Sie das Lagerungsschlüsselwort auf einem Read-Only-Eigentum angeben müssen, indem Sie entweder stark oder schwach beitragen werden:

@property (stark, nichtatomar, read-only-) MyView* myViewController; myViewController;

Das gibt den Eigentumsrecht-Qualifikator des ivar durch die @property Behauptung an. Die Alternative würde den ivar manuell erklären sollen, der das Eigentum zwingen wird, denselben Eigentumsrecht-Qualifikator wie der ivar zu verwenden.

Für Experten: Das Ermitteln in der Übersetzungszeit, wenn KREISBOGEN ermöglicht wird

Wenn Sie herausfinden müssen, ob Ihr Code mit oder ohne KREISBOGEN zum Beispiel gebaut wird, wenn Sie der Entwickler einer öffentlichen Bibliothek sind, können Sie die folgenden Makros verwenden, um zu bestimmen, ob KREISBOGEN während der Übersetzung ermöglicht wird.

//definieren Sie einige LLVM3 Makros, wenn der Code mit einem verschiedenen Bearbeiter (d. h. LLVMGCC42) kompiliert wird
#ifndef __ has_feature
#define __ has_feature (x) 0
#endif
#ifndef __ has_extension
#define __ has_extension __ has_feature//Vereinbarkeit mit vor3.0 Bearbeitern.
#endif

#if __ has_feature (objc_arc) && __ clang_major __> = 3
#define ARC_ENABLED 1
#endif//__ has_feature (objc_arc)

Für Experten: Erlauben Sie Gebrauch von KREISBOGEN-Schlüsselwörtern mit dem arbeitsunfähigen KREISBOGEN

Als ein Bibliotheksautor eines der schlechtesten Dinge konnten Sie tun, um sicherzustellen, dass die rückwärts gerichtete Vereinbarkeit Ihrer Bibliothek zu #ifdef jedes mit dem KREISBOGEN SPEZIFISCHE Schlüsselwort ist und schreiben Sie jede solche Linie zweimal: einmal ohne das KREISBOGEN-Schlüsselwort, einmal mit dem KREISBOGEN-Schlüsselwort.

//SCHLECHTE PRAXIS!!
#ifdef ARC_ENABLED
  void* pointerToSelf = (__ überbrücken Leere *), selbst; (__bridge void*)self;
#else
  void* pointerToSelf = (Leere *) selbst; (void*)self;
#endif//ARC_ENABLED

Stattdessen habe ich vor, einfach die KREISBOGEN-Schlüsselwörter als "noop" Behauptungen zu definieren, wenn KREISBOGEN nicht verfügbar ist. So wird Ihr Code, KREISBOGEN-Schlüsselwörter verwendend, noch unter Xcode 4.1 oder LLVM GCC4.2 kompilieren, und Sie brauchen zu #ifdef nichts Verbundenes mit jenen Schlüsselwörtern.

//nicht das Verwenden lässt LLVM Bearbeiter laut erklingen, oder LLVM Version ist nicht 3.x
#if! definiert (__ klingen __), || __ clang_major __ <3

#ifndef __ Brücke
#define __ Brücke
#endif
#ifndef __ bridge_retained
#define __ bridge_retained
#endif
#ifndef __ bridge_transfer
#define __ bridge_transfer
#endif
#ifndef __ Autoausgabe
#define __ Autoausgabe
#endif
#ifndef __ stark
#define __ stark
#endif
#ifndef __ schwach
#define __ schwach
#endif
#ifndef __ unsafe_unretained
#define __ unsafe_unretained
#endif

#endif//__ clang_major __ <3

Jetzt ist es sicher, Code wie das unabhängig davon zu schreiben, ob KREISBOGEN verfügbar ist oder nicht, weil Bearbeiter, die KREISBOGEN nicht unterstützen, nur den Stammkunden (Leere *) Wurf sehen werden:

void* pointerToSelf = (__ überbrücken Leere *), selbst; (__bridge void*)self;

Mythos: KREISBOGEN ist zuverlässig nicht bewiesen worden

Als ob automatisches Speichermanagement ein magisches Eigentum hat, das gelegentlich verrückt geht.

KREISBOGEN folgt noch demselben alloc, behalten Sie, veröffentlichen Sie Zyklus des Objektiven-C Codes. Es gibt keine Zweideutigkeiten und keine speziellen Fälle, wenn es zur Verwendung der wenigen und einfachen Alloc-Retain-Release-Regeln kommt. Das ist völlig deterministisch, und der Bearbeiter kann diesen Job genauso gut, nein, besser tun als Sie. Es gibt nichts von Natur aus und potenziell unzuverlässig über den KREISBOGEN. This is entirely deterministic and the compiler can do that job just as well, no, better than you. There’s nothing inherently and potentially unreliable about ARC.

Wenn Sie über Probleme mit dem KREISBOGEN gehört haben, dann sind sie wahrscheinlich mit Situationen verbunden, wo ein KREISBOGEN app mit dem Kernfundament oder anderem C/C ++ Code verbindet. In jenen Situationen werden Sie die verschiedenen neuen Schlüsselwörter (Brücke-Würfe größtenteils) richtig anwenden müssen. Machen Sie einen Fehler dort, und Sie verschafften sich ein Problem. Aber es ist nicht die Schuld des KREISBOGENS. Dasselbe geht dafür behalten Zyklen, die noch eine Möglichkeit im KREISBOGEN apps sind. Make a mistake there and you got yourself a problem. But that’s not the fault of ARC. The same goes for retain cycles, which are still a possibility in ARC apps.

Ich wettete auch mein Leben, dass Apfel nicht bekannt geben, fördern und KREISBOGEN für das EIN/AUSGABE-STEUERSYSTEM und Mac OS X apps durchführen würde, wenn es stabil nicht bewiesen worden war. Wenn das Sie nicht überzeugt, dann vielleicht tut dieses Zitat des KREISBOGEN-Entwicklers Chris Lattner:

KREISBOGEN wird sorgfältig gebaut, um ein zuverlässiges Programmiermodell zu sein, das sich auf der Seite irrt, einen Bearbeiter-Fehler zu erzeugen, anstatt ein Laufzeitspeicherproblem still zu erzeugen.

Das erklärt auch wenig, warum Sie sehen werden, dass mehr (Initiale) Fehler mit dem ermöglichten KREISBOGEN kompilieren.

Mythos: KREISBOGEN nimmt Kontrolle über das Speichermanagement weg

Einige behaupten, dass KREISBOGEN Ihre Kontrolle über das Speichermanagement wegnimmt. Das würde der Reihe nach weniger führen als optimales Zeitverhalten. Künftig ist KREISBOGEN schlecht und sollte vermieden werden. Henceforth ARC is bad and should be avoided.

Sie konnten dasselbe sinnlose Argument auf die Servolenkung anwenden. Es gibt einige Hartnäckige, die lieber Servolenkung gerade wegen eines subjektiven Gefühls über die verlierende Kontrolle nicht haben möchten. Ignorieren Sie diese Leute! Nicht weil sie sich irren, sind sie in einigen Verhältnissen richtig - es ist gerade, dass jene Verhältnisse selten, sehr spezialisiert sind und ein hohes Niveau der Sachkenntnis verlangen, die die restlichen 99 % von Benutzern einfach nicht haben, noch würden trainieren wollen. Ignore these people! Not because they’re wrong, they are correct in some circumstances – it’s just that those circumstances are rare, very specialized and require a high level of skill that the remaining 99% of users simply don’t have, nor would want to exercise.

Und selbst wenn Sie wirklich die Sachkenntnisse haben, sind Sie noch Fehlern des Urteils oder anderen menschlichen Fehlern unterworfen. So werden sogar die Experten aus dem Verwenden des KREISBOGENS (oder Servolenkung, was das betrifft) in täglichen Situationen einen Nutzen ziehen.

Einige Menschen, die behaupten, dass KREISBOGEN Kontrolle wegnimmt, scheinen nicht zu verstehen, was KREISBOGEN tut. Speichermanagement ist über die Lebenszeit von Gegenständen, ob das Speichermanagement mit dem KREISBOGEN oder Handbuch automatisiert wird. Wenn eine Lebenszeit eines Gegenstands überall in der kompletten Szene (Ansicht, Niveau, app, usw.) dann ist, dass Gegenstand einmal zugeteilt wird, wenn die Szene, und deallocated initialisiert wird, wenn die Szene deallocated ist. Ob Sie tun, läuft das manuell, oder automatisch, auf dasselbe Verhalten der Anwendung hinaus. If an object’s lifetime is throughout the entire scene (view, level, app, etc) then that object is allocated once when the scene is initialized, and deallocated when the scene is deallocated. Whether you do this manually, or automatically, results in the same behavior of the application.

Jeder muss verstehen, dass KREISBOGEN deterministisch ist. Es soll nicht für die Müll-Sammlung falsch sein! Müll-Sammlungszyklen können in in jedem zufälligen Moment rechtzeitig treten, wenn der Müllmann es notwendig findet, etwas Gedächtnis zu befreien. In der gesammelten Umgebung eines Mülls, wie C #, verlieren Sie wirklich etwas Kontrolle über das Speichermanagement, und in einigen Situationen führt das zu unsicherem Zeitverhalten. Aber nicht mit dem KREISBOGEN. Garbage collection cycles can kick in at any random moment in time when the garbage collector finds it necessary to free up some memory. In a garbage collected environment, such as C#, you do lose some control over memory management and in some situations this leads to unsteady runtime performance. But not with ARC.

Zu sagen, dass KREISBOGEN Kontrolle über das Speichermanagement entfernt, ist gerade einfaches Unrecht und wahrscheinlich basiert in der Annahme, dass KREISBOGEN der Müll-Sammlung gleich ist. Es kann auch vom "falschen positives" stammen, dass das Klappern, das Statischer Analysator erzeugt, der Zweifel über "automatisierte" Klappern-Technologien im Allgemeinen eingeträufelt haben kann, wenn auch statische Analyse und KREISBOGEN völlig getrennte Stücke der Technologie sind.

Entweder Weg in einigen Fällen müssen Sie eventuell Kontrolle über das Speichermanagement ausüben, und mit dem KREISBOGEN können Sie noch das, gewöhnlich mit den neuen KREISBOGEN-Schlüsselwörtern stark und schwach tun, sowie Würfe für Zeigestöcke überbrücken, die Grenzen von oder bis C/C ++ Land durchqueren. So lange Sie der Lebenszeit Ihrer Gegenstände bewusst sind, werden Sie kein Problem haben beeinflussend, wie die Lebenszeit von Gegenständen durch den KREISBOGEN geführt wird.

KREISBOGEN teilt immer zu und veröffentlicht ein Gedächtnis eines Gegenstands an demselben Punkt rechtzeitig in derselben (deterministischen) Situation. So kann das Ziel-C mit dem KREISBOGEN nicht im Vergleich zu gesammelten Sprachen des Mülls wie C #. sein, wenn Sie jemanden sehen KREISBOGEN mit C # vergleichen, senden Sie ihnen bitte diese Verbindung.

KREISBOGEN-Bezugsdokumentation und verwandte Artikel

Die weiterführende Literatur für diejenigen, die mehr über den KREISBOGEN im Detail erfahren wollen.

Teilen Sie mir bitte mit, wenn ich vergaß, irgendetwas über den KREISBOGEN hinzuzufügen! Besonders, wenn Sie denken, dass es allgemeiner knowlARCdge sein sollte. Und vergessen Sie nicht, dieser Artikel wiederzuziepen, wenn Sie ihn, Dank mögen! And don’t forget to retweet this article if you like it, thanks!


Dieser Artikel wurde zu Ihnen dadurch gebracht...

Ich genieße sehr viel den Lernprozess, das Stoßen von Grenzen (meiniger und Ihriger und diese der Technologie), die Freiheit habend, zu verfolgen, was auch immer auf meiner Meinung zu kühn dem Programm ist, was keiner vorher programmiert hat, und zu schreiben, worüber ich erfahren habe. Helfen Sie mir, Ihnen zu helfen, die Produkte im Erfahren des Cocos2D Ladens durchsuchend.


Sie können auch Ihren zeigen (viel geschätzt!) Wohltat, mir ein Geschenk sendend.

12 Antworten auf "Alles müssen Sie über das automatische Bezugszählen (KREISBOGEN) wissen"

  1. Bastelraum sagt:

    Als ich über die Mac Entwicklung las, ist es aufgelegt, dass ich einige 10/15 Jahre zurück rechtzeitig ging.

  2. Cesc sagt:

    Ich habe nach einem Schriftsatz wie das, Danke gesucht!!

    Ich denke, dass das viele Ideen über den KREISBOGEN klären wird. Großer Job :)

  3. Holger sagt:

    Welcher großer Posten. Dank sehr viel dafür. sieht wie ein gutes Ding aus, am Wochenende zu tun :) looks like a good thing to do on the weekend :)

  4. Jim sagt:

    Ein Ding, das ich nicht im Stande gewesen bin, noch auszurechnen, besteht darin, wie man Versand mit dem KREISBOGEN verwendet. Details in dieser Stapel-Überschwemmungsfrage:

    http://stackoverflow.com/q/7858980/8427

  5. Andre Araujo sagt:

    Schrecklich, Steffen! Große Zusammenfassung.
    Ich hatte nach Information über überbrückte Würfe gesucht, und die Anwenden Dokumentation hat eigentlich nichts darüber. Dieser Artikel und die Verweisungen, die Sie zur Verfügung stellten, halfen viel.

    Dank!
    Andre

  6. Bavarious sagt:

    Dass 'Sie ein Eigentum nicht schaffen können, dessen Name mit "dem neuen"' Bit beginnt, ist nicht ziemlich wahr. Sieh: http://stackoverflow.com/q/6327448/557219http://stackoverflow.com/q/6327448/557219

    • Das ist im Apfel, der wechselt ist, um Ausgabe-Zeichen ZU FUNKEN:

      Um Zwischenoperation mit dem manuellen Behalten-Ausgabe-Code zu erlauben, erlegt KREISBOGEN einige Einschränkungen der Methode und das variable Namengeben auf:
      Sie können nicht einem Eigentum einen Namen geben, der mit neu beginnt.

      Die Verbindung, die Sie zur Verfügung stellten, gibt eine Lösung diesem Problem zum Beispiel, das Eigentum von "newObject" bis "theNewObject" umbenennend.

      • Bavarious sagt:

        Ja habe ich Apfel gesagt, dass ihre Behauptung nicht wirklich wahr ist (es gibt mindestens zwei andere Ungenauigkeiten in diesem Dokument).

        Umbenennung des Eigentums ist eine Lösung, aber es gibt zwei andere Lösungen, in denen das Eigentum umbenannt nicht wird: Umbenennung der Hauer-Methode, und das Spezifizieren einer verschiedenen Methode-Familie für die Hauer-Methode. Diese zwei Lösungen erlauben, ein Eigentum zu verwenden, dessen Name mit neu anfängt. These two solutions allow using a property whose name starts with new.

  7. Nick Lewycky sagt:

    "Zum Beispiel ist LLVM 3.0 jetzt im Stande, eine potenzielle "Reihe aus" Probleme dank des SAFECode-Projektes" zu entdecken

    Ein ebenso nettes Projekt wie SAFECode ist, der nicht ist, was die Reihe aus Warnungen meldet. Es ist gerade eine gewöhnliche Klappern-Warnung, und wurde zuerst hier begangen: http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20110214/038831.htmlhttp://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20110214/038831.html

  8. Yevgeniy sagt:

    Ich versuchte, Ihre Makros zu verwenden, "In der Übersetzungszeit entdeckend, wenn KREISBOGEN ermöglicht wird", aber es scheint mir, dass es richtig nicht arbeitet.

    • "scheint", und "nicht richtig" sind schrecklich ungenaue Beschreibungen dessen, was geschieht. Die Makros arbeiten bestimmt, ich verwende sie in Kobold2D sehr. Seien Sie überzeugt, die Makros in einer Kopfball-Datei zu definieren und diesen Kopfball in den Quelldateien zu importieren, wo Sie die Makros verwenden. Be sure to define the macros in a header file and import that header in the source files where you’re using the macros.

  9. [...] gehört über das Objektive-C automatische Bezugszählen (KREISBOGEN). Und Sie haben darüber hier und dort und jeder wo gelesen. Aber Sie verwenden nicht [...] But you’re not using [...]

Verlassen Sie eine Antwort