黑馬程式設計師學習筆記
_oc記憶體管理2
1、迴圈引用:對於迴圈依賴關係來說,比方a類引用b類,同時b類也引用a類這種**編譯會報錯。 2
、@class
:當使用@class在兩個類相互宣告,就不會出現編譯報錯,使用@class 類名; 就可以引用乙個類,說明一下它是乙個類。 3
、和#import
的區別1>#import方式會包含被引用類的所有資訊,包括被引用類的變數和方法;@class方式只是告訴編譯器在a.h檔案中b *b 只是類的宣告,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正去檢視b類中資訊
2>如果有上百個頭檔案都#import了同乙個檔案,或者這些檔案依次被#improt,那麼一旦最開始的標頭檔案稍有改動,後面引用到這個檔案的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來講,使用@class方式就不會出現這種問題了
3>在.m實現檔案中,如果需要引用到被引用類的實體變數或者方法時,還需要使用#import方式引入被引用類
4>迴圈retain
比如a物件retain了b物件,b物件retain了a物件
這樣會導致a物件和b物件永遠無法釋放
解決方案:
當兩端互相引用時,應該一端用retain、一端用assign4、
autorelease:
1>給某個物件傳送一條autorelease訊息時,就會將這個物件加到乙個自動釋放池中當自動釋放池銷毀時,會給池子裡面的所有物件傳送一條release訊息
2>呼叫autorelease方法時並不會改變物件的計數器,並且會返回物件本身
3>autorelease實際上只是把對release的呼叫延遲了,對於每一次autorelease,系統只是把該物件放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有物件會被呼叫release 5
、自動釋放池的建立
ios 5.0後
@autoreleasepool
在程式執行過程中,可以建立多個自動釋放池,它們是以棧的形式存在記憶體中oc物件只需要傳送一條autorelease訊息,就會把這個物件新增到最近的自動釋放池中(棧頂的釋放池)
6、應用例項:跟release的對比以前:
book *book = [[book alloc] init];
[book release];
現在:book *book = [[[book alloc] init]autorelease];
// 不要再呼叫[book release];
一般可以為類新增乙個快速建立物件的類方法
+ (id)book
外界呼叫[book book]時,根本不用考慮在什麼時候釋放返回的book物件
黑馬程式設計師 oc語言學習筆記之記憶體管理一
oc語言記憶體管理一 一.記憶體管理的原理 1 物件的所有權及引用計數 物件的所有權 任何物件都可能擁有乙個或者多個所有者,只要乙個物件至少擁有乙個所有者,它就會繼續存在 2 物件的引用計數器 每個oc物件都有自己的引用計數器,是乙個整數表示物件被引用的次數,即現在有多少東 西在使用這個物件,物件剛...
黑馬程式設計師 OC學習筆記 記憶體管理
property和 synthesize關鍵字 property和 synthesize關鍵字可以幫助我們構造屬性的設定和訪問方法即setter和getter方法,可以省去我們很多重複機械的 在宣告檔案中使用 property 宣告變數,在實現檔案中用 synthesize property 關鍵字...
黑馬程式設計師 iOS開發之OC之記憶體管理
1 retain 1 2 release 1 3 retaincount 獲得計數器 1 set方法的實現 void setcar car car 2 dealloc方法的實現 不要直接呼叫dealloc,系統自動呼叫 void dealloc 1 oc物件型別 property nonatomic...