記憶體管理的思考方式

2021-07-15 06:35:51 字數 1722 閱讀 5419

首先看到「引用計數」這個詞,我們會不自覺想到「某處有某物多少」,而將注意力放到計數上。

但是更加正確的思考方式是:

objective-c記憶體管理中的alloc/retain/release/dealloc方法分別是nsbject類的alloc類方法、retain例項方法、release例項方法、dealloc例項方法。

id obj = [[nsobject alloc]init]; 

指向生成並持有物件的指標被賦值給變數obj

id obj = [nsobject new];

new 和 alloc 是完全一致的

copy 方法利用基於nscopying方法約定,由各類實現的copywithzone:方法生成並持有物件副本。與copy方法類似,mutablecopy方法利用基於nsmutablecopying方法約定,由各類實現的mutablecopywithzone:方法生成並持有物件副本。兩者的區別在於,copy方法生成不可變的物件,而mutablecopy方法生成可變物件。者類似於nsarray和nsmutablearray的差異。用這些方法生成的物件,雖然是物件副本,但同alloc/new/方法一樣,在「自己生成並持有物件」這點沒有改變。

另外使用下列方法也以為著自己生成並持有物件

(駝峰命名法)

- allocmyobject

- newthatobject

- copythis

- mutablecopyyourobject

2.不是自己的生成的物件,自己也能持有

因為不是自己生成並持有,所以自己不是物件的持有者。我們可以使用array

id obj = [nsmutablearray array];

[obj retain];

nsmutablearray類物件被賦給變數obj,但變數obj自己並不持有該物件。使用retain方法可以持有物件。

通過retain方法,不是自己生成的物件,就變成自己所持有的物件。

自己持有的物件,一旦不再需要,持有者有義務釋放該物件。釋放使用release方法。

[obj release];

若用retain方法變成自己持有,也同樣可以用release方法釋放。

//通過方法生成物件

-(id)allocobejct

id obj1 = [obj0 allocobejct];

新增autorelease方法

-(id)allocobejct

使用autorelease方法,可以使取得的物件存在,但是自己不持有物件,是物件在超出指定的生存範圍時能夠自動並正確地釋放(呼叫release)。

使用nsmutablearray類的array類方法等可以取得誰都不持有的物件,這些方法都是通過autorelease實現的,此時這些取得誰都不持有的物件的方法名不能以alloc/new/copy/mutablecopy開頭。

當然也可以通過retain來持有物件

倘若在程式中釋放了不是自己持有的物件就會造成崩潰。例如自己生成並持有物件後,在釋放完不再需要的物件只有再次釋放。

id obj = [[nsobject alloc]init];

[obj release];

[obj release];

程式崩潰,再次廢棄已經廢棄的物件是崩潰,訪問已經廢棄的物件時崩潰。

或者釋放了不是自己持有的物件,肯定會崩潰。

對Linux記憶體管理的思考

經典!看了對低端物理記憶體和高3 核心的虛擬記憶體被連續對映到最低端的物理記憶體。這是所有問題的開始。為什麼要把核心的虛擬位址空間連續地對映到物理記憶體最低端?這個根本不是個問題。開發人員或是出於效率的原因或是出於實現的原因,就是做了這樣的設計。但這種設計卻引發了很多令人困惑的問題。假設我們使用32...

自動記憶體管理技術的思考

我是乙個學過一點c 語言的人。在c 中,沒有自動記憶體管理,卻有很多可以值得借鑑的思路。我認為乙個記憶體,申請了,卻不用,然後,不用了,卻不釋放,都是一種資源浪費,而不是說,程式最終都會在某乙個時刻 釋放就叫防止記憶體洩漏了。就算有一小部分記憶體我是永遠都用不上,洩露了,而相對有大部分記憶體不能好好...

關於記憶體管理思考方式的一些學習總結

談到記憶體管理首先想到的是 引用計數 這個名稱,但真正正確客觀的去思考這個問題,應該先理解以下幾點 下面我們看一下物件操作對應的 物件方法 oc方法 生成並持有的物件 alloc new copy mutablecopy等方法 持有的物件 retain方法 釋放物件 release方法 廢棄物件 d...