emailconfirmed, nsInternRO, nsInternRW, Administrators
3,356
edits
m (→Links) |
(→Regeln) |
||
Line 137: | Line 137: | ||
* '''<span style="color:red;">Wer nicht <tt>alloc, new, copy, retain</tt> aufruft, darf nicht <tt>release</tt> aufrufen</span>''' | * '''<span style="color:red;">Wer nicht <tt>alloc, new, copy, retain</tt> aufruft, darf nicht <tt>release</tt> aufrufen</span>''' | ||
* Niemals <tt>dealloc</tt> selbst aufrufen (es sei denn man überschreibt die Methode und ruft <tt>[super dealloc]</tt> auf! | * Niemals <tt>dealloc</tt> selbst aufrufen (es sei denn man überschreibt die Methode und ruft <tt>[super dealloc]</tt> auf! | ||
== ARC == | |||
=== Was ist ARC === | |||
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 vier Schlüsselwörtern: | |||
* __strong | |||
* __weak (>iOS5!) | |||
* __unsafe_unretained | |||
* __bridge | |||
=== Beispiel Deklaration === | |||
So wird aus folgendem Beispiel... | |||
<source lang="ObjC">MyObject : NSObject { | |||
NSString *myName; | |||
id<MyProtocol> delegate; | |||
int myNumber; | |||
} | |||
@property(nonatomic, retain) NSString* myName; | |||
@property(nonatomic, assign) id<MyProtocol> delegate; | |||
@property(nonatomic) int myNumber; | |||
</source> | |||
...dieser Code mit ARC: | |||
<source lang="ObjC">MyObject : NSObject { | |||
NSString __strong_ *myName; | |||
id<MyProtocol> __weak_ delegate; | |||
int myNumber; | |||
} | |||
@property(nonatomic, strong) NSString* myName; | |||
@property(nonatomic, weak) id<MyProtocol> delegate; // weak is iOS5 only, could also use __unsafe_unretained | |||
@property(nonatomic) int myNumber; | |||
</source> | |||
=== Beispiel no more retain/release === | |||
Mit ARC gibt es nun einfach kein retain mehr; dies ist mustergültiger Code: | |||
<source lang="ObjC">id myObj = [[MyClass alloc] init]; | |||
self.myProperty = myObj; | |||
// no more [myObj release]; | |||
return; | |||
</source> | |||
Auch entfallen manche Methoden komplett, es gibt keinen Grund mehr -(void)dealloc zu überschreiben. | |||
=== Voraussetzungen === | |||
Mindest-Voraussetzungen zum Einsatz von ARC: | |||
* iOS 5 SDK mit Xcode4 | |||
* Apple LLVM compiler 3.0 | |||
* Bei bestehenden Projekten kann der Refactor-Assistent zum Migrieren genutzt werden (Achtung: u.U. muss das .git Verzeichnis temporär verschoben werden) | |||
Darüber hinaus ist ARC zu iOS 4.x abwärtskompatibel, wenn man: | |||
* kein __weak benutzt sondern __unsafe_unretained | |||
Siehe auch: | |||
* http://www.learn-cocos2d.com/2011/11/everything-know-about-arc/ | |||
[[Category:Added ARC]] | |||
== Links == | == Links == |