iPhone應用開發技巧學習筆記
iphone應用開發技巧學習筆記是本文要介紹的內容,主要介紹了Autorelease、屬相定義Property、對象的操作。不多說,我們先來看內容。
誤釋放對象
問題一:
- value = [array objectAtIndex:n]; // 得到一個數組中的對象
- [arry removeObjectAtIndex:n]; //卸載那個對象
因為value得到了那個對象,但是由于另外一個擁有者release了該對象,所以其實value現在成了搖擺指針(無效數據)
問題二:
- myArray = [NSArray array]; ... [myArray release];
NSArray返回的是一個自動釋放對象,不僅myArray不應該在一段時間后release,而應該在適當的時候先retain,以防止該array被系統誤釋放。
問題三:
- rocket = [rocketLauncher aRocket]; [rocketLauncher release];
和array這種數據收集類對象一樣,如果我們得到了一個類的子對象而不retain它,那么在原父類被釋放的時候,這個rocket其實也會失去其意義。
對Autorelease的誤解
Cocoa的內存管理分為 索引計數法(Reference Counting/ Retain Count)和 垃圾收集法(Garbage Collection)。而iPhone上目前只支持前者,所以Autorelease就成為很多人的“捷徑”。
但是!Autorelease其實并不是“自動釋放”,不像垃圾收集法,對對象之間的關系偵測后發現垃圾-刪除。但是Autorelease其實是“延后釋放”,在一個運行周期后被標記為Autorelease會被釋放掉。
切記小心使用Autorelease,理解Autorelease,防止在你還需要該對象的時候已經被系統釋放掉了。
屬性項目的定義Property
- @property (copy, nonatomic) NSString *title;
什么是assign,copy,retain之間的區別?
assign: 簡單賦值,不更改索引計數(Reference Counting)。
copy: 建立一個索引計數為1的對象,然后釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
retain的實際語法為:
- - (void)setName:(NSString *)newName { if (name != newName) { [name release];
- name = [newName retain]; // name’s retain count has been bumped up by 1 } }
說了那么麻煩,其實接下來的話最重要:
?如果你不懂怎么使用他們,那么就這樣 ->
使用assign: 對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等)
使用copy: 對NSString
使用retain: 對其他NSObject和其子類
nonatomic關鍵字:
nonatomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數據錯誤。而這種機制是耗費系統資源的,所以在iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。
小結:iPhone應用開發技巧學習筆記的內容介紹完了,希望通過本文的學習對你有所幫助。