emailconfirmed, nsInternRO, nsInternRW, Administrators
3,356
edits
(→Regeln) |
m (minor update) |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
WICHTIG: Diese Seite handelt von mittlerweile mehr oder weniger obsolet gewordenem Memory Management. | |||
Unter Punkt 6. ARC wird die aktuelle Vorgehensweise beschrieben! | |||
== Retain-Count == | == Retain-Count == | ||
| Line 145: | Line 149: | ||
Seit dem LLVM 3.0 Compiler (enthalten im iOS 5 SDK) gibt es Automated Reference Counting, das auf Compiler-Ebene automatisiert retain-/release calls einfügt. Demnach müssen alle obigen Regeln eigentlich nicht mehr beachtet werden, was eine unglaubliche Erleichterung für den Programmierer darstellt. Die Kenntnis über die Speicherverwaltung ist zwar noch von Vorteil, aber man spart sehr viele Zeilen Code und die Gefahr eines Programmabsturzes wird deutlich geringer. | Seit dem LLVM 3.0 Compiler (enthalten im iOS 5 SDK) gibt es Automated Reference Counting, das auf Compiler-Ebene automatisiert retain-/release calls einfügt. Demnach müssen alle obigen Regeln eigentlich nicht mehr beachtet werden, was eine unglaubliche Erleichterung für den Programmierer darstellt. Die Kenntnis über die Speicherverwaltung ist zwar noch von Vorteil, aber man spart sehr viele Zeilen Code und die Gefahr eines Programmabsturzes wird deutlich geringer. | ||
Arc besteht im Prinzip aus | Arc besteht im Prinzip aus nur wenigen Schlüsselwörtern. Bis auf __weak sind dabei alle schon in ObjC vorhanden und daher abwärtskompatibel: | ||
* __strong | * __strong | ||
* __weak (>iOS5!) | * __weak (>iOS5!) | ||
* __unsafe_unretained | * __unsafe_unretained | ||
* __bridge | * __bridge ( inkl. __bridge_retained und __bridge_transfer) | ||
* __autoreleasing (@autorelease) | |||
=== Vorteile === | |||
* ARC ist ''kein'' Garage Collector, es passiert nichts zur Laufzeit | |||
* Der Code wird auf Compiler-Ebene optimiert und läuft daher '''schneller als vorher'''! | |||
* ARC ist zu iOS4 und Snow Leopard 10.6 abwärtskompatibel | |||
* Crash-Safe: deutlich weniger Abstürze wegen Speicherproblemen | |||
* Weniger Code | |||
* Der Programmierer kann sich auf das Wesentliche konzentrieren | |||
| Line 167: | Line 181: | ||
...dieser Code mit ARC: | ...dieser Code mit ARC: | ||
<source lang="ObjC">MyObject : NSObject { | <source lang="ObjC">MyObject : NSObject { | ||
NSString | NSString __strong *myName; | ||
id<MyProtocol> | id<MyProtocol> delegate; | ||
int myNumber; | int myNumber; | ||
} | } | ||
@property(nonatomic, strong) NSString* myName; | @property(nonatomic, strong) NSString* myName; | ||
@property(nonatomic, | @property(nonatomic, assign) id<MyProtocol> delegate; | ||
@property(nonatomic) int myNumber; | @property(nonatomic) int myNumber; | ||
</source> | </source> | ||
=== Aktuelles Beispiel (März 2013) === | |||
...oder noch einfacher: | |||
(und im Augenblick die empfohlene Vorgehensweise) | |||
<source lang="ObjC">MyObject : NSObject { } | |||
@property(nonatomic, strong) NSString* myName; | |||
@property(nonatomic, assign) id<MyProtocol> delegate; | |||
@property(nonatomic) int myNumber; | |||
</source> | |||
Bei letzterem Beispiel werden alle Instanzvariablen durch Properties ersetzt. D.h. man muss sie mit self. ansprechen (also self.myNumber anstatt myNumber). | |||
| Line 191: | Line 219: | ||
=== Voraussetzungen === | === Voraussetzungen === | ||
Mindest-Voraussetzungen zum Einsatz von ARC: | Mindest-Voraussetzungen zum Einsatz von ARC: | ||
* Apple LLVM compiler 3.0 | * Apple LLVM compiler 3.0 | ||
** enhalten im iOS 5 SDK bzw. Mac OS X 10.5. SDK mit Xcode 4 | |||
* Bei bestehenden Projekten kann der Refactor-Assistent zum Migrieren genutzt werden (Achtung: u.U. muss das .git Verzeichnis temporär verschoben werden) | * Bei bestehenden Projekten kann der Refactor-Assistent zum Migrieren genutzt werden (Achtung: u.U. muss das .git Verzeichnis temporär verschoben werden) | ||
| Line 201: | Line 229: | ||
* http://www.learn-cocos2d.com/2011/11/everything-know-about-arc/ | * http://www.learn-cocos2d.com/2011/11/everything-know-about-arc/ | ||
== Links == | == Links == | ||
| Line 208: | Line 236: | ||
{{Template:iPhoneDev}} | {{Template:iPhoneDev}} | ||
[[Category:Added ARC]] | |||