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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈内存开辟问题和Block内存问题

發(fā)布時間:2023/11/30 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈内存开辟问题和Block内存问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們知道,內存分為棧,堆,塊。

棧中的內存由系統(tǒng)自己釋放,堆是存對象初始化的地方,塊是CPU與內存連接的緩沖器,運行速度比內存快,比CPU慢。

例如,我們NSMutableArray *array = [NSMutableArrar new];

NSMutableArray *array就在棧中,NSMutableArray類型的指針。[NSMutableArray new]開辟的內存在堆中,我們可以理解為

NSMutableArray *array --->[NSMutableArrar new];

棧中的指針指向堆中的對象。

我們用static或者const關鍵字定義常量,一般在內存塊中開辟內存空間。在塊中開辟內存空間的對象讀寫速度最快,但是我們要注意,塊的內存很小。

?

block代碼是在塊中執(zhí)行的,所以它的運行速度要比delegate等效率高。但是使用block容易造成內存泄露。

原因在網上找到了:http://www.cnblogs.com/hanjun/p/3767394.html

  • NSGlobalBlock:類似函數(shù),位于text段;我們可以通過是否引用外部變量識別,未引用外部變量即為NSGlobalBlock,可以當做函數(shù)使用。
  • NSStackBlock:位于棧內存,函數(shù)返回后Block將無效;
  • NSMallocBlock:位于堆內存,NSMallocBlock只需要對NSStackBlock進行copy操作就可以獲取。

?

  • Block_copy與copy等效,Block_release與release等效;
  • 對Block不管是retain、copy、release都不會改變引用計數(shù)retainCount,retainCount始終是1;
  • NSGlobalBlock:retain、copy、release操作都無效;
  • NSStackBlock:retain、release操作無效,必須注意的是,NSStackBlock在函數(shù)返回后,Block內存將被回收。即使retain也沒用。容易犯的錯誤是[[mutableAarry addObject:stackBlock],(補:在arc中不用擔心此問題,因為arc中會默認將實例化的block拷貝到堆上)在函數(shù)出棧后,從mutableAarry中取到的stackBlock已經被回收,變成了野指針。正確的做法是先將stackBlock copy到堆上,然后加入數(shù)組:[mutableAarry addObject:[[stackBlock copy] autorelease]]。支持copy,copy之后生成新的NSMallocBlock類型對象。
  • NSMallocBlock支持retain、release,雖然retainCount始終是1,但內存管理器中仍然會增加、減少計數(shù)。copy之后不會生成新的對象,只是增加了一次引用,類似retain;
  • 盡量不要對Block使用retain操作。

轉載于:https://www.cnblogs.com/hansIOS/p/5228352.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的浅谈内存开辟问题和Block内存问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。