iOS記憶體管理學習筆記二

2021-09-20 01:10:00 字數 1356 閱讀 6821

繼續學習記憶體管理相關知識。

1、小小知識點

1>有關oc記憶體管理的方法並不包括在該語言中,而是包含在cocoa框架中,用於os x,ios的開發。

2>cocoa框架中foundation框架類庫中的nsobject類負責記憶體管理的職責。

4>使用以下方法自己生成的物件,自己持有

+alloc

+new

+copy

+mutablecopy

例如:

nsobject * obj =[ [nsobject alloc]init];
使用alloc方法生成物件,並把指向該物件的指標賦值給了obj這個變數,現在這個物件的retaincount值等於1。

另外,使用new方法生成物件基本等同於[ [nsobject alloc]init]。

即:[nsobject new] --------- [[nsobject alloc]init];

題外話:[nsobject new]和 [[nsobject alloc]init]到底有什麼區別呢?

我一直不相信他們沒有任何區別,如果真是沒有任何區別又為什麼要寫兩個方法呢?

new方法的原始碼:

+new 

而 alloc/init 像這樣

+alloc 

-init

概括來說,new和alloc/init在功能上幾乎是一致的,分配記憶體並完成初始化。

差別在於,採用new的方式只能採用預設的init方法完成初始化,採用alloc的方式可以用其他定製的初始化方法。

5>非自己生成的物件,自己也能持有

id obj = [nsarray array];

obj可以取得物件的存在,但是並不持有該物件。

如果想持有該物件,需要主動呼叫retain方法,即:

[obj retain];

這樣obj就持有了該物件。

6>自己持有的物件,如果不在需要了,就需要釋放該物件,釋放物件使用release方法。

//生成並持有該物件

id obj = [[nsobject alloc]init];

//釋放該物件

[obj release];

//非自己生成物件

id obj = [nsarray array];

//持有物件

[obj retain];

//釋放物件

[obj release];

注意:已經釋放的物件是不可以再次訪問的,如果訪問了已經被釋放的物件,就會造成崩潰。(wow,好可怕,但是一定遇見過)。

記憶體管理學習筆記

1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...

object c 記憶體管理學習筆記

nsautoreleasepool pool nsautoreleasepool alloc init pool drain 這個函式可以把autoreleasepool裡的物件釋放 在for迴圈中每次都釋放記憶體池的示例 nsautoreleasepool temppool for i 0 i a...

effectiveC 記憶體管理 學習筆記

1.盡量使用初始化列表而不要再建構函式裡賦值,初始化順序和宣告的順序一致,一些型別如const,引用等,必須使用初始化。對於非內部資料型別成員物件應當採用初始化表,以獲取更高的效率。example b b const a a m a a 只呼叫了類a的拷貝建構函式 2.基類都使用虛析構函式,這樣才能...