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