記憶體管理 問題集錦一

2021-07-08 11:05:42 字數 1287 閱讀 2197

1、以下**有什麼問題嗎?如果沒有的話,obj、obj2的引用計數分別是多少?如果有問題的話存在什麼問題?

class *obj = [[class alloc] init]; //引用計數 為  1

class *obj2 = obj; //這裡只是賦值

[obj hello];

[obj release]; // 引用計數 減為 0

[obj2 hello]; //也許,程式執行到這行**不會立即崩潰,因為釋放記憶體是需要一定時間的。

[obj2 release]; //這行肯定崩潰,因為已經沒有記憶體拿給obj2釋放了,再釋放,屬於過度釋放了。

2、在實際開發的過程中,什麼情況下需要建立自動釋放池?下面**中有沒有什麼問題?

mrc模式,自己建立後或者擁有乙個物件後,需要自己負責釋放。

mrc下的記憶體管理機制有三條原則:

第一條:使用 alloc / new / copy 都使其引用計數加1 

第二條:通過其他方法(便利構造器)獲得物件,要明白其內部引用計數加1,並且內部已經使用autorelease幫我們釋放記憶體。所以也就是我們儘管用即可。

第三條:要保證retain 和 release 的出現次數相等。也就是保證記憶體沒有浪費。

正是由於在mrc下,管理記憶體很麻煩,對乙個物件的銷毀時機也不是很清楚的時候,引入arc來管理ios的記憶體,相對於程式設計師的我們來說,使用起來十分方便。

arc :自動引用計數。

就需要借助於自動釋放池,自動釋放池其實主要是針對與 autorelease 來說的。因為不知道什麼時候應該釋放這個物件,所以我們借助於自動釋放池。一旦走出來自動釋放池,物件就立馬銷毀。但是自動釋放池也有很多缺陷。比如說,自動釋放池,含有特別多的物件的auturelease ,由於autorelease 不能立即釋放記憶體,所以在沒有出自動釋放池之前,記憶體一直都沒有得到釋放,物件一多,就會造成記憶體緊張。

所以,什麼情況下需要建立自動釋放池,鄙人覺得,就是在我們拿不定時機來釋放某乙個物件的時候,就需要建立自動釋放池,便於記憶體管理。
person *personone = [[person alloc] init]; // 引用計數 為 1

@autoreleasepool //出了這個自動釋放池,personone 的引用計數減為 0 ,之後記憶體被釋放

} //此時,出這個自動釋放池的話,已經沒有記憶體共personone來釋放的了,屬於過度釋放。

記憶體管理 問題集錦二

3 arc 下 dealloc 方法存在的意義在於什麼地方?舉例說明一下具體的使用場景。唯一乙個留著 dealloc 方法的原因就是,你需要釋放一些不在 arc 控制下的資源。例如 core foundation 物件中呼叫 cfrelease 對那些通過 malloc 分配的記憶體呼叫 free ...

作業系統記憶體管理問題集錦

1.可採用哪幾種方式將程式裝入記憶體?它們分別適用於何種場合?a.首先由編譯程式將使用者源 編譯成若干目標模組,再由鏈結程式將編譯後形成的目標模組和所需的 庫函式鏈結在一起,組成乙個裝入模組,再由裝入程式將裝入模組裝入記憶體 b.裝入模組的方式有 絕對裝入方式,可重定位方式和動態執行時裝入方式 c....

學生管理系統問題集錦一

問題1 當資料庫中記錄為空時,開啟 修改學籍資訊 窗體會報錯 解決方法 檢測此時student info表中記錄集是否為空 如果為空,則開啟 新增學籍資訊 窗體 如果不為空,則開啟 修改學籍資訊 窗體 private sub modifysinfomenu click 定義資料庫連線的字串 dim ...