一、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í)。