objective-c的物件記憶體管理是一件非常有意思的事情,由其是在iphone嵌入式裝置中.
想玩的省心點,就得熟知它的管理規則,由其是記憶體的管理機制。了解它的品性了才能在cocoa的世界裡如魚得水。否則,反之(如水得魚!!^_^)。
1,乙個物件可以有乙個或多個擁有者
2,當它乙個擁有者都沒有時,它就會被**
3,如果想保留乙個物件不被**,你就必需成為它的擁有者(ownership)
所有記憶體管理的原則全在這裡!!
簡單??哈哈!
名人曰:「大道至簡」
這兒玩意兒說起來比過家家還容易,但其實有些事情真正做起來並不是簡單的事兒~~
咱們首先來說怎麼樣才能成為乙個物件的擁有者。cocoa提供了乙個機制叫"reference counting",翻譯過來就是「關聯記數器」(自己翻譯的,真不知叫啥,如果有官方的翻譯請通知我)。每乙個物件都有乙個關聯記數的值。當它被建立 時,它的值為「1」。當值減少到「0」時,就會被**(呼叫它的deallocate方法,如果沒有寫,則呼叫從nsobject繼承而來的**方法,下 文有說,一定要重寫該方法)。 以下幾個方法可以操作這個記數:
1,alloc
為物件分配記憶體,記數設為「1」,並返回此物件。
2,copy
複製乙個物件,此物件記數為「1」,返回此物件。你將成為此轉殖物件的擁有者
3,retain
物件「關聯記數」加「1」,並成為此物件的擁有者。
4,release
物件「關聯記數」減「1」,並丟掉此物件。
5,autorelease
在未來的某一時刻,物件「關聯記數」減「1」。並在未來的某個時間放棄此物件。
有了上面的幾個方法(當然這也是所有的記憶體操作的方法,簡單吧,哈哈哈)你就可以隨意操作乙個物件的記數。並部分或完全的控制它的生命週期。但實際 應用中,隨意亂寫上面的任何乙個方法都可能會帶來嚴重的記憶體洩露。混亂的記憶體分配等於沒完沒了的麻煩工作,你不想在情人節的日子還在為記數之類的鳥問題而丟了老婆吧~~哈哈哈,為了美麗溫柔賢惠又善解人意的準老婆請牢記以下四條:
1,乙個**塊內要確保copy, alloc 和 retain 的使用數量與 release 和 autorelease 的數量相同。
2,在使用以「alloc」或「new」開頭或包含「copy」的方法,或「retain」乙個物件時,你就會變為它的擁有者。
3,實現「dealloc」方法,並施放所有的例項變數。(其實這裡還有很多的巧兒門!!)
4,永不自己呼叫「dealloc」方法,這是系統當「retain」減到「0」時,自動呼叫的。手動呼叫會引起retain count記數錯誤(多一次的release)。
其實做到這些也不難,
retain count 增加與減少的方法對應,板丁板做到了就行了。
Objective C 記憶體管理
objective c 記憶體管理 nsautoreleasepool pool nsautoreleasepool alloc init pool drain 事實上程式中可以有多個自動釋放池。自動釋放池其實並不包含實際的物件本身,僅僅是對釋放的對 象的引用。通過向目前的自動釋放池傳送一條auto...
Objective C 記憶體管理
objective c中,記憶體物件分二類 1 值型別,如 int float struct等基本資料型別 2 引用型別,通常是指繼承自nsobject類的oc物件 值型別在棧中,由系統自動管理,而引用型別在堆上,需要我們自己手工進行管理 oc中提供了二種記憶體管理機制 1 手動引用計數 mrc m...
Objective C(記憶體管理)
引用計數器 每個oc物件都有乙個佔4個位元組儲存空間的引用計數器 當使用或建立乙個物件時,新物件的引用計數器預設是1 retain 可以使引用計數器 1 release 可以是引用計數器 1 retaincount 獲得當前的引用計數器的值 當物件被銷毀時,會重寫dealloc方法 void dea...