資源描述:
《iOS內(nèi)存暴增問題追查與使用陷阱》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、iOS內(nèi)存暴增問題追查與使用陷阱原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處,作者信息和本聲明。否則將追究法律責(zé)任。hg://baidutech.blog.51clo.com/4114344/742967iOS平臺(tái)的內(nèi)存使用引用計(jì)數(shù)的機(jī)制,并且引入了半自動(dòng)釋放機(jī)制;這種使用上的多樣性,導(dǎo)致開發(fā)者在內(nèi)存使用上非常容易出現(xiàn)內(nèi)存泄漏和內(nèi)存莫名的增長情況;木文會(huì)介紹iOS平臺(tái)的內(nèi)存使用原則與使用陷阱;深度剖析autorelease機(jī)制;低內(nèi)存報(bào)警后的處理流程;并結(jié)合自身實(shí)例介紹內(nèi)存暴增的問題追查記錄以及相關(guān)工具的使用情況;TAG內(nèi)存暴增,內(nèi)存泄漏,autorclcasc;
2、內(nèi)存報(bào)警;iOS平臺(tái)內(nèi)存常見問題作為iOS平臺(tái)的開發(fā)者,是否曾經(jīng)為內(nèi)存問題而苦惱過?內(nèi)存莫名的持續(xù)增長,程序莫名的crash,難以發(fā)現(xiàn)的內(nèi)存泄漏,這些都是iOS平臺(tái)內(nèi)存相關(guān)的常見問題;木文將會(huì)詳細(xì)介紹iOS平臺(tái)的內(nèi)存管理機(jī)制,autorclcasc機(jī)制和內(nèi)存的使用陷阱,這些將會(huì)解決iOS平臺(tái)內(nèi)存上的大部分問題,提高了程序的穩(wěn)定性;1iOS平臺(tái)內(nèi)存管理介紹iOS平臺(tái)的內(nèi)存管理采用引用計(jì)數(shù)的機(jī)制:當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí)使用alloc或者allWithZone方法時(shí),引用計(jì)數(shù)就會(huì)+1;當(dāng)釋放對(duì)象使用release方法時(shí),引用計(jì)數(shù)就是這就意味著每一個(gè)対象都會(huì)跟蹤有多少其他對(duì)象引用它,一旦引用計(jì)
3、數(shù)為0,該對(duì)象的內(nèi)存就會(huì)被釋放掉;另外,iOS也提供了一種延時(shí)釋放的機(jī)制AutoRelease,以這種方式申請(qǐng)的內(nèi)存,開發(fā)者無需手動(dòng)釋放,系統(tǒng)會(huì)在某一時(shí)機(jī)釋放該內(nèi)存;山于iOS平臺(tái)的這種內(nèi)存管理的多樣性,導(dǎo)致開發(fā)者在內(nèi)存使用上很容易出現(xiàn)內(nèi)存泄漏或者程序莫名崩潰的情況,木文會(huì)詳細(xì)介紹iOS平臺(tái)內(nèi)存的使用規(guī)范與技巧以及如何利用工具避免或者發(fā)現(xiàn)問題;下圖是內(nèi)存從申請(qǐng)到釋放的一個(gè)完整示例:alloc/initreleosereleaseRetailcount?1retoinClassCdassAalloc/initClassA引毛計(jì)數(shù)=1:aClassBretainClassAClass
4、A引壬計(jì)數(shù)=2:ClassCcopyClassAClassA引用計(jì)數(shù)=2:ClassC引毎計(jì)數(shù)ClassAreleaseClassCreleaseClassBreleaseClassAV%*^*Zw*ZZw*w*w*引壬計(jì)數(shù)=1:2iOS平臺(tái)內(nèi)存使用原則2.1對(duì)象的所有權(quán)與銷毀ClassC引用計(jì)數(shù)=0;ClassA弓庫計(jì)數(shù)=0:vwvvvwwvv^*系統(tǒng)謁屯dealloc系統(tǒng)遁Wdealloc2.1.1誰創(chuàng)建f誰釋放;如果是以alloc,new或者copy,mutableCopy創(chuàng)建的對(duì)象,則必須調(diào)用release或者autorelease方法釋放內(nèi)存;如果沒有釋放,則導(dǎo)致內(nèi)存泄
5、漏!2.1.2誰retain,誰釋放;如果對(duì)一個(gè)對(duì)象發(fā)送retain消息,其引用訃數(shù)會(huì)+1,則使用完必須發(fā)送release或者autorclcasc方法釋放內(nèi)存或恢復(fù)引用計(jì)數(shù);如果沒有釋放,則導(dǎo)致內(nèi)存泄漏!2.1.3沒創(chuàng)建且沒retain,別釋放;不要釋放那些不是自己alloc或者retain的對(duì)象,否則程序會(huì)crash;不要釋放autorelease的對(duì)象,否則程序會(huì)crash;2.2對(duì)象的深拷貝與淺拷貝一般來說,復(fù)制一個(gè)對(duì)彖包括創(chuàng)建一個(gè)新的實(shí)例,并以原始對(duì)象中的值初始化這個(gè)新的實(shí)例。復(fù)制非指針型實(shí)例變量的值很簡單,比如布爾,整數(shù)和浮點(diǎn)數(shù)。復(fù)制指針型實(shí)例變量有兩種方法。一種方法
6、稱為淺拷貝,即將原始對(duì)象的指針值復(fù)制到副本中。因此,原始對(duì)象和副本共享引用數(shù)據(jù)。另一種方法稱為深拷貝,即復(fù)制指針?biāo)玫臄?shù)據(jù),并將其賦給副本的實(shí)例變量。2.2.1深拷貝深拷貝的流程是先創(chuàng)建一個(gè)新的對(duì)象尺引用計(jì)數(shù)為1,并用舊對(duì)象的值初始化這個(gè)新對(duì)象;ClassA*objA=[[ClassAalloc]initj;ClassA*objB=[objAcopy];objB是一個(gè)新對(duì)象,引用計(jì)數(shù)為1,且objB的數(shù)據(jù)等同objA的數(shù)據(jù);注意:objB需要釋放,否則會(huì)引起內(nèi)存泄漏!2.2.2淺拷貝淺拷貝的流程是,無需引入新的對(duì)象,把原有對(duì)象的引用計(jì)數(shù)+1即可ClassA*objA=[[Cla
7、ssAalloc]initj;ClassA*objB=[objAretain];注意:objB需耍釋放,恢復(fù)objA的引用計(jì)數(shù),否則會(huì)引起內(nèi)存泄漏!2.3對(duì)象的存取方法2.3.1屬性聲明和實(shí)現(xiàn)變量聲明的常用屬性類型包括readonly,assign,retain和copy;且系統(tǒng)會(huì)自動(dòng)為聲明了屬性的變量生成set和gel函數(shù);readonly屬性:只能讀,不能寫;assign屬性:是默認(rèn)屬性,直接賦值,沒有任何保留與釋放問題;retain屬性:會(huì)增加原有對(duì)象的引用計(jì)數(shù)并且在賦值前