iOS 內(nèi)存管理基礎(chǔ)

一、Object C中內(nèi)存管理的對(duì)象

在iOS開發(fā)中,內(nèi)存中的對(duì)象有兩類,一類是值類型,例如:init、float等基本數(shù)據(jù)類型;另一類是引用類型,繼承NSObject類的所有OC對(duì)象。值類型 使用的棧內(nèi)存管理方式,不需要我們管理。 引用類型 使用的是堆內(nèi)存管理方式,需要我們管理內(nèi)存,管理不當(dāng),容易產(chǎn)生內(nèi)存泄漏。

每個(gè)OC對(duì)象都有 一個(gè)引用計(jì)數(shù),表示對(duì)象被引用的次數(shù)。引用計(jì)數(shù)為0,對(duì)象被回收,不為0則沒被回收。當(dāng)對(duì)象執(zhí)行alloc 、new、retain時(shí),引用計(jì)數(shù)加1,執(zhí)行release時(shí),引用計(jì)數(shù)減1。

二、Object-C管理內(nèi)存的方式

1、MRC ?手動(dòng)內(nèi)存管理

MRC模式下,所有內(nèi)存都需要自己手動(dòng)的使用retain、release來管理內(nèi)存。為了避免出現(xiàn)野指針,我們?cè)卺尫诺臅r(shí)候,先讓指針=nil;

2、ARC 自動(dòng)內(nèi)存管理

ARC是iOS5推出的,可以自動(dòng)管理內(nèi)存。在ARC模式下,只要沒有強(qiáng)引用指向?qū)ο?,?duì)象就會(huì)被釋放。在ARC模式下,不允許使用retain 、release、retaincount等方法。 并且在dealloc方法里面,不允許調(diào)用[super dealloc]方法。

ARC模式下的@property變量的修飾詞為strong 、weak,相當(dāng)于MRC模式下的retain、assign。strong:代替retain,表示強(qiáng)引用。weak: 代替assign,表示弱引用,聲明了一個(gè)可以自動(dòng)設(shè)置為nil的弱引用,但比assign多一個(gè)功能,指針指向多地址被釋放之后,指針本身也會(huì)被自動(dòng)釋放。

三、與內(nèi)存相關(guān)的一些關(guān)鍵字

strong:強(qiáng)引用,在ARC中使用,與MRC中的retain相似,使用之后,計(jì)數(shù)器加1。

weak: 弱引用,在ARC中使用,如果指向的對(duì)象被釋放了,其指向nil,可以避免野指針,其引用計(jì)數(shù)為1。

readwrite:可讀可寫屬性,需要生成getter、setter方法時(shí)使用。

readOnly: ?只讀屬性,只生成 getter方法,不會(huì)生成setter方法。

assign:賦值屬性,不涉及引用計(jì)數(shù),弱引用,setter方法將傳入的參數(shù)賦值給實(shí)例變量。

retain:表示持有特性,setter方法將傳入的參數(shù)先保留,在賦值,傳入的參數(shù)的retaincount + 1。

copy :表示拷貝特性,setter方法將傳入的對(duì)象復(fù)制一份,需要完全一份新的變量。

nonatomic: 非原子性操作,不加同步,多線程訪問 可以提高性能,但是線程不安全。決定編譯器生成的setter、getter方法是否是原子操作。

atomic: 原子性操作,同步的,表示多線程安全。

這里需要注意:

strong與copy的區(qū)別:copy在setter方法最終是拷貝了參數(shù)內(nèi)容,創(chuàng)建了一塊新的內(nèi)存,所以無論老地址里面的數(shù)據(jù)如何改變,對(duì)新數(shù)據(jù)并沒有影響。而strong,本質(zhì)是retain,只是copy了指針而已。

四、MRC與ARC混編

現(xiàn)在大部分程序會(huì)選擇ARC方式,但是很多第三方的框架還是用的MRC。所以在項(xiàng)目中倒入一些第三方的框架,需要進(jìn)行標(biāo)識(shí),否則編譯時(shí)會(huì)報(bào)錯(cuò)。

在ARC項(xiàng)目中,對(duì)MRC的文件可以添加編譯選項(xiàng)-fno-objc-arc的標(biāo)識(shí)。

在MRC項(xiàng)目中,對(duì)ARC的文件可以添加編譯選項(xiàng)-fobjc-arc的標(biāo)識(shí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 軟件運(yùn)行時(shí)會(huì)分配和使用設(shè)備的內(nèi)存資源,因此,在軟件開發(fā)的過程中,需要進(jìn)行內(nèi)存管理,以保證高效、快速的分配內(nèi)存,并且...
    Mr_Atom閱讀 740評(píng)論 0 2
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 2,081評(píng)論 1 16
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,822評(píng)論 8 119
  • 內(nèi)存管理的基本范圍和概念. 程序運(yùn)行過程中藥創(chuàng)建大量的對(duì)象, 和其他高級(jí)語言類似,在ObjC中對(duì)象存儲(chǔ)在堆區(qū),程序...
    ValienZh閱讀 962評(píng)論 0 2
  • 本節(jié)學(xué)習(xí)內(nèi)容: 1.滾動(dòng)視圖的高級(jí)屬性 2.滾動(dòng)視圖的協(xié)義函數(shù) 3.滾動(dòng)視圖的高級(jí)使用 【ViewControll...
    奔跑的小小魚閱讀 610評(píng)論 0 0

友情鏈接更多精彩內(nèi)容