日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

1.1 objective-c中的内存管理

發(fā)布時(shí)間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.1 objective-c中的内存管理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  備注:本來(lái)在一年前有一個(gè)出版社找到我,讓我寫(xiě)一系列關(guān)于iOS性能優(yōu)化的書(shū)。但是一直因?yàn)楣ぷ髟?#xff0c;沒(méi)有能夠按時(shí)交付。(其實(shí)就是自己懶)所以現(xiàn)在講已經(jīng)寫(xiě)好的部分章節(jié)分享到博客中,希望對(duì)大家有所幫助,如果有什么不對(duì)的地方,也希望大家指正出來(lái),大家共同討論。也可以加我qq:1583042987,備注寫(xiě)上博客園,大家一起討論一下關(guān)于iOS的技術(shù)。好了,進(jìn)入正文。

  想要了解objective-c中的內(nèi)存管理,首先需要知道引用計(jì)數(shù)的概念,那什么是引用計(jì)數(shù)?很多初學(xué)者對(duì)此的了解都局限于概念,并沒(méi)有真的理解。那接下來(lái)用一個(gè)例子來(lái)解釋這一個(gè)抽象的概念。

  在學(xué)校的圖書(shū)館里,有一個(gè)班級(jí)組織閱讀活動(dòng),圖書(shū)館此時(shí)對(duì)該班級(jí)開(kāi)發(fā),每一名學(xué)生都去圖書(shū)館借用一到多本書(shū),此時(shí)學(xué)生持有的資源也就是書(shū)的數(shù)量,而圖書(shū)館對(duì)于班級(jí)的每個(gè)人員的借書(shū)情況都進(jìn)行了紀(jì)錄,當(dāng)學(xué)生閱讀結(jié)束后,需要將書(shū)的資源釋放,歸還給圖書(shū)館,當(dāng)所有學(xué)生都將書(shū)歸還的時(shí)候,即代表這次閱讀活動(dòng)結(jié)束,圖書(shū)館將關(guān)閉對(duì)該班級(jí)的資源使用開(kāi)發(fā),直到下次請(qǐng)求。那這里面需要思考幾個(gè)問(wèn)題:-,當(dāng)圖書(shū)館關(guān)閉資源開(kāi)放,而學(xué)生還沒(méi)有盡數(shù)歸還書(shū)籍時(shí),會(huì)造成什么樣的問(wèn)題?二,如果學(xué)生們都還完書(shū),但是圖書(shū)館再次向?qū)W生所要書(shū)籍資源時(shí)會(huì)出現(xiàn)什么問(wèn)題?

  這是項(xiàng)目?jī)?nèi)存管理方面兩個(gè)最為常見(jiàn)的問(wèn)題,第一個(gè)問(wèn)題稱(chēng)之為“內(nèi)存泄漏”,意思是沒(méi)有廢棄或者說(shuō)沒(méi)有釋放已不再使用的內(nèi)存資源,第二個(gè)問(wèn)題稱(chēng)之為“過(guò)度釋放”,意思是再次釋放已經(jīng)釋放掉的內(nèi)存資源。這兩個(gè)問(wèn)題最為嚴(yán)重的是第一種,因?yàn)槠洳⒉粫?huì)拋出什么異常,這樣的結(jié)果將導(dǎo)致內(nèi)存的不合理分配,極大程度上的影響app性能,而第二種往往會(huì)導(dǎo)致程序崩潰(crash),崩潰情況為再度廢棄已經(jīng)廢棄的對(duì)象時(shí)崩潰,訪問(wèn)已經(jīng)廢棄的對(duì)象時(shí)崩潰,以下代碼將展現(xiàn)過(guò)度釋放問(wèn)題。

???????????? /*

???? ??? ??????* 開(kāi)辟內(nèi)存空間,生成并持有對(duì)象

??? ???????? ?*/

?? ????????? ?id obj = [[NSObject alloc]init];

?? ????? ????/*

?? ????????? ?* 釋放obj對(duì)象

??? ???? ??? ?*/

??? ???????? [obj release];

?? ? ???????? /*

?? ? ???????? ?* 過(guò)度釋放對(duì)象,程序?qū)伋霎惓?/p>

?? ????? ????*/

???????????? ??[obj release];

?? ???????????控制臺(tái)輸出日志:malloc: *** error for object 0x7fa3e86102c0: pointer ?????????????being freed was not allocated

???????? *** set a breakpoint in malloc_error_break to debug

  為解決這兩個(gè)問(wèn)題,編寫(xiě)者必須明確對(duì)象的使用周期,如事例所示,在圖書(shū)館至少存在一名學(xué)生使用圖書(shū)資源時(shí)保持開(kāi)放狀態(tài),而在無(wú)人借書(shū)時(shí)保持關(guān)閉狀態(tài)。其運(yùn)行邏輯為。當(dāng)班級(jí)組織閱讀活動(dòng)時(shí),管理員(編寫(xiě)者)向圖書(shū)館請(qǐng)求內(nèi)存資源。之后有學(xué)生前來(lái)借書(shū),管理員對(duì)該學(xué)生進(jìn)行紀(jì)錄并分配其內(nèi)存資源。活動(dòng)結(jié)束后,學(xué)生們歸還圖書(shū),管理員對(duì)學(xué)生歸還情況進(jìn)行紀(jì)錄,釋放其持有資源。最后歸還圖書(shū)時(shí),管理員確認(rèn)之后,關(guān)閉對(duì)資源的開(kāi)放。為了能夠很好的紀(jì)錄學(xué)生的借還情況,這里面引入了一個(gè)管理員的計(jì)數(shù)技術(shù)用以計(jì)算可用的圖書(shū)資源,以及使用資源情況。接下來(lái)再透過(guò)這個(gè)例子的延伸解釋這一技術(shù)的運(yùn)作實(shí)現(xiàn)。班級(jí)向圖書(shū)館發(fā)送使用圖書(shū)資源的請(qǐng)求,第一名學(xué)生向圖書(shū)館借書(shū),資源計(jì)數(shù)加1。計(jì)數(shù)值從0變?yōu)?,因此要開(kāi)放資源。第二名學(xué)生向圖書(shū)館借書(shū),需要資源加1。計(jì)數(shù)值由1變成2。第三名學(xué)生再次向圖書(shū)館借書(shū),需要資源再次加1。計(jì)數(shù)變成3,第四名,第五名依次類(lèi)推成n。當(dāng)有學(xué)生首先完成閱讀之后,需要?dú)w還書(shū)籍,每歸還一本圖書(shū)時(shí)計(jì)數(shù)減1,那么當(dāng)?shù)谝幻麑W(xué)生歸還時(shí),計(jì)數(shù)由n減1。直到最后一名學(xué)生歸還書(shū)籍的時(shí)候,計(jì)數(shù)變?yōu)?,圖書(shū)館關(guān)閉對(duì)于此次活動(dòng)的資源開(kāi)放。如圖1.1所示。

?  

?

??????????????????????????? ?圖1.1? 引用計(jì)數(shù)演示圖

通過(guò)上例可以知道,計(jì)數(shù)技術(shù)可以更加明確資源使用情況,進(jìn)而更好的管理內(nèi)存。在objective-c中,內(nèi)存就是這個(gè)圖書(shū)館,而學(xué)生則被成為“對(duì)象的使用環(huán)境”,班級(jí)活動(dòng)就是對(duì)象,每個(gè)圖書(shū)館內(nèi)的圖書(shū)都是有限的,計(jì)算機(jī)的資源也是一樣,所以盡可能的有效使用資源顯得尤為重要。那么在objective-c是怎么處理這些事情呢?

在iOS中可以分為MRC(Manual Retain Release.手動(dòng)釋放),以及iOS 5之后引入的ARC(Automatic Reference Counting,自動(dòng)引用計(jì)數(shù)),兩種內(nèi)存管理機(jī)制。而在Mac OS X 10.8系統(tǒng)之前還有“Garbage Collector”(垃圾回收機(jī)制),但這里面的回收機(jī)制與java中的并不相同,它是后臺(tái)有一個(gè)線程負(fù)責(zé)檢查已經(jīng)不再使用的對(duì)象,然后釋放,這就會(huì)帶來(lái)兩個(gè)很大的問(wèn)題,一個(gè)是由于線程一直運(yùn)行,會(huì)影響到cpu的使用效率,二是會(huì)造成內(nèi)存釋放遲緩,或者內(nèi)存泄漏。

本節(jié)簡(jiǎn)單的介紹了一下objective-c的內(nèi)存管理,了解了引用計(jì)數(shù),以及管理的幾種方式,接下來(lái)將著重地對(duì)內(nèi)存管理進(jìn)行分塊式詳細(xì)講解。

轉(zhuǎn)載于:https://www.cnblogs.com/xuruofan/p/5759956.html

總結(jié)

以上是生活随笔為你收集整理的1.1 objective-c中的内存管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。