iOS知識學習 記憶體管理

2021-06-14 02:31:33 字數 2104 閱讀 4600

記憶體管理是在程式執行期間分配記憶體,使用並釋放的過程。乙個好的程式會盡可能的用很少的記憶體。

當你的程式結束的時候,你要知道如何去管理應用程式的記憶體,不需要的物件要釋放掉。

記憶體管理的示例圖如下:

從圖中可以看出,當沒有指標指向某個物件的時候,這個物件將會被摧毀。

objective-c提供了兩種記憶體管理的方式:

1、mrc(manual retain-release):手動的記憶體管理,從英文也可以看出有retain和release來管理記憶體;

2、arc(automatic reference counting):自動記憶體管理,編譯器在編譯的時候,編譯器會在適當的地方插入相應的記憶體管理的**。

兩種方法導致不正確的記憶體管理:

①釋放或重寫正在使用的資料

會導致記憶體錯誤,主要引起程式崩潰,錯誤或者使用者資料錯誤;

②沒有釋放不在使用的資料導致記憶體洩漏記憶體洩漏就是分配好的記憶體空間沒有釋放或者不在使用,洩漏導致你的應用程式在使用不斷增加的記憶體,會導致很差的系統表現,或者你的應用程式被終結。

記憶體管理政策

基於記憶體管理的規則

記憶體管理模式基於物件的擁有權,任何物件都擁有乙個或多個所有者,只要乙個物件還有乙個或多個所有者,物件將繼續存在,如何物件沒有所有者,那麼執行期間系統將會自動destroy他。

-你對你建立的物件擁有所有權;

-你可以通過retain來獲得乙個物件的擁有權;

-如果你不需要某個物件,你必須放棄對這個物件的擁有權;

-你不能釋放你不是擁有者的物件。

自動釋放池

關於自動釋放池:

-自動釋放池通過@autoreleasepool標記

@autoreleasepool
在自動釋放池結束的時候,在塊裡面的物件會接收到autorelease資訊,系統會在適當的時候釋放這個物件。

-跟其他**塊一樣,自動釋放池是可以重疊的

@autoreleasepool 

. . .

}

如果你在自動釋放池外面傳送乙個autorelease資訊,cocoa會記錄乙個合適的錯誤資訊。

-可以自己建立乙個自動釋放池,以下三種情況:

-如果你的程式不是基於ui框架的;

-如果你寫了乙個迴圈,裡面產生了大量的臨時變數物件;

-如果你建立第二線程(你必須建立自己的自動釋放池一旦你的執行緒開始執行,否則你的程式將會洩露物件)。

arc的新規則

①你不能很明確的應用dealloc,或者繼承或引用retain, release,retaincount, or autorelease;

-使用@selector(retain), @selector(release), 等等也是禁止的;

-在arc中使用自定義的dealloc方法不需要呼叫 [super dealloc];

-你仍然可以使用cfretain, cfrelease, 和core foundation-style相關的其他功能;

②你不能使用nsallocateobject ornsdeallocateobject;

③在c結構體中不能使用物件指標;

④id和*沒有實質性區別;

⑤你不能使用nsautoreleasepool物件:

-arc允許@autoreleasepool blocks代替,這比nsautoreleasepool更有優勢;

⑥你不能使用記憶體區域;

⑦你不能以new開頭來命名乙個訪問器。

weak引用

weak引用並不延長他指向的物件的生命時間,當沒有strong指向這個物件的時候會自動的變為nil。

你應當充分利用這些特性來管理你程式中的物件圖,特別是arc並不反對strong引用,利用weak來保證你不建立乙個環。

在arc中,strong是物件型別預設的。

IOS學習 OC記憶體管理

記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...

IOS記憶體管理知識總結(一)

首先我們要清楚 1.堆 和 棧 objective c的物件在記憶體中是以堆的方式分配空間的,並且堆記憶體是由你釋放的,就是release oc物件存放於堆裡面 堆記憶體要程式設計師手動 非oc物件一般放在棧裡面 棧記憶體會被系統自動 堆裡面的記憶體是動態分配的,所以也就需要程式設計師手動的去新增記...

ios記憶體管理

引用計數 每個物件有乙個與之相關的整數,稱作 引用計數器 或者 保留計數器 當某段 需要訪問乙個物件時,該段 會將物件的保留計數器 1,表示需要訪問這個物件 當結束對該物件的訪問時,保留計數器 1,表示它不在訪問該物件 當保留計數器為0時,物件被銷毀,所佔記憶體被系統收回。當使用new retain...