淺談內存開辟問題和Block內存問題

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

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

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

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

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

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

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

?

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

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

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

?

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396743.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue render函數_Vue原理解析(一):Vue到底是什么?

Vue,現在前端的當紅炸子雞,隨著熱度指數上升,實在是有必要從源碼的角度,對它功能的實現原理一窺究竟。個人覺得看源碼主要是看兩樣東西,從宏觀上來說是它的設計思想和實現原理;微觀上來說就是編程技巧&…

scrapy爬蟲-setting.py

# Obey robots.txt rulesROBOTSTXT_OBEY False  不遵從網站的robots.txt法則 # See also autothrottle settings and docsDOWNLOAD_DELAY 3  每次下載延遲3秒,防止造成網站攻擊 # Override the default request headers:DEFAULT_REQUEST_HEADERS { Accept:…

android點擊左上角劃出,使用Android中的Path和RectF在左上角右上角左下角繪制圓角...

有一個Path#addRoundRect()重載,它接受一個包含八個值的float數組,其中我們可以為四個角中的每一個指定x和y半徑.這些值為[x,y]對,從左上角開始,順時針繞其余部分.對于我們想要舍入的那些角,我們將該對的兩個值都設置為半徑值,并將它們保留為零,而不是那些.作為一個說明性示例,…

Nodejs微信開發

因為使用了Bot Framework開發了一個小功能,它目前支持了Skype\Teams\Slack等,但在國內來講,微信還是一個比較流行的軟件,所以需要接上微信 原來開發Bot的時候使用的是.Net開發的,這次我決定使用Nodejs開發一個簡單的后…

性別有什么用_為啥不讓男孩玩布娃娃?別讓你的“性別偏見”,給孩子的人生設限...

在養育孩子的過程中,父母總是會犯許多錯誤,更是有一些錯誤會直接使孩子毀掉一生,而性別偏見正是很多家長都會去犯的錯誤,對男孩和女孩有著刻板印象,也正是因為這一點使孩子的潛力和天賦被壓制。前幾天我帶著孩子去逛商…

android的時間代碼怎么寫,Android 日期和時間的使用實例詳解

Android 日期和時間的使用日期和時間的使用;1:彈出框TimePickerDialog,DatePickerDialog2:組件TimePicker,DatePickerTimePickerDialog的使用:通過點擊button顯示圖一,然后用戶可以設置時間DatePickerDialog的使用只需…

andriod studio 查看項目依賴_Intellij IDEA 中如何查看maven項目中所有jar包的依賴關系圖...

Maven 組件界面介紹如上圖標注 1 所示,為常用的 Maven 工具欄,其中最常用的有:第一個按鈕:Reimport All Maven Projects 表示根據 pom.xml 重新載入項目。一般單我們在 pom.xml 添加了依賴包或是插件的時候,發現標注 4…

Springboot 2.0.0單元測試

1. 引入spring-boot-starter-test包 1 <?xml version"1.0" encoding"UTF-8"?>2 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"3 xsi:schemaLocation"…

SPRING IN ACTION 第4版筆記-第二章-002-@ComponentScan、@Autowired的用法

一、ComponentScan 1. Configuration //說明此類是配置文件 ComponentScan //開啟掃描&#xff0c;會掃描當前類的包及其子包 public class CDPlayerConfig { } 2. ComponentScan(basePackages{"soundsystem", "video"})//掃描多個包 public class CDP…

Kurento協議

2019獨角獸企業重金招聘Python工程師標準>>> Kurento媒體服務器可以被兩種外部Kurento客戶端控制&#xff0c;如Java或JavaScript。這些客戶端使用Kuernto協議來和KMS通信。Kurento 協議是基于WebSocket協議&#xff0c;并使用了JSON-RPC V2.0 消息來提交請求和發送…

升級php7_PhpStorm 2019.3 發布,全面支持 PHP 7.4

PhpStorm 2019.3 發布了&#xff0c;這個版本主要集中在性能和質量上&#xff0c;旨在提供一個更穩定、更快的 IDE。PhpStorm 2019.3 全面支持 PHP 7.4&#xff0c;還帶來 PSR-12 代碼樣式&#xff0c;用于遠程解釋器的 WSL&#xff0c;MongoDB 支持&#xff0c;HTTP 客戶端更新…

ftp 客戶端 使用http代理 源碼_代理服務器連接HTTPS過程

說到HTTPS代理很多人瞬間就會聯想到HTTPS的各種證書和各種加密&#xff0c;覺得很高端很復雜的樣子。其實不然&#xff0c;代理服務器不需要配置證書、也不需要處理任何加密。因為HTTPS代理是通過Web隧道(Web tunnel)工作的。Web隧道允許用戶通過HTTP連接發送非HTTP流量(例如FT…

python解zuobiaoxi方程_Python還能解決數學相關問題?大學生:以后就靠他了,事半功倍...

問題背景高等數學應用非常廣&#xff0c;基本上涉及到函數的地方都要用到微積分&#xff0c;還有在幾何方面也是如此&#xff0c;計算機的應用讓我們能簡單快速處理各種高等數學中的計算&#xff0c;比如極限、導數、積分、微分方程等的計算。實驗目的使用 Python 通過計算與作…

Android版:驗證手機號碼的正則表達式 (轉)

/** * 驗證手機格式 */ public static boolean isMobileNO(String mobiles) { /* 移動&#xff1a;134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 聯通&#xff1a;130、131、132、152、155、156、185、186 電信&#xff1a;133、…

基礎正則表達式介紹與練習

基礎正則表達式介紹與練習 一、什么是正則表達式 在做文字處理或編寫程序時&#xff0c;用到查找、替換等功能&#xff0c;使用正則表達式能夠簡單快捷的完成目標。簡單而言&#xff0c;正則表達式通過一些特殊符號的幫助&#xff0c;使用戶可以輕松快捷的完成查找、刪除、替換…

android canvas 網絡圖,【巨坑:toDataURL】canvas合成網絡圖片

不知有沒有小伙伴用過canvas合成圖片&#xff0c;然后爆炸報錯截圖尼瑪&#xff0c;然后各種搜索&#xff0c;不外乎以下幾種坑爹處理方案&#xff1a;后端處理&#xff0c;比如Access-Control-Allow-Origin "*"(要是請求到其他網站的圖片就不適用了&#xff0c;比如…

水晶報表如何查看sql_有了這個報表工具,一鍵生成自定義的各種報表,還可以導出Excel...

EasyReport是一個簡單易用的Web報表工具,它的主要功能是把SQL語句查詢出的數據轉換成報表頁面&#xff0c; 同時支持表格的跨行(RowSpan)與跨列(ColSpan)配置。 同時它還支持報表Excel導出、圖表顯示及固定表頭與左邊列的功能。功能介紹本工具從數據庫(MySQL,Oracle,SQLServer,…

python 三維向量 交互_Blender實現Nature of Code1.5單位向量[Nature of Node 004]

【Nature of Node #004】Blender創意編程進階應用&#xff1a;實現Nature of CodeNature of Code 1.5, Unit Vector (Normalize)背景介紹這個系列“Nature of Node”&#xff0c;是專門用Blender的Node&#xff08;節點&#xff09;方式來實現Nature of Code。用到一個Blender插…

Sitemesh3的使用及配置

1 . Sitemesh 3 簡介 Sitemesh 是一個網頁布局和修飾的框架&#xff0c;基于 Servlet 中的 Filter&#xff0c;類似于 ASP.NET 中的‘母版頁’技術。參考&#xff1a;百度百科&#xff0c;相關類似技術&#xff1a;Apache Tiles。 官網&#xff1a;http://wiki.sitemesh.org/wi…

等保項目流程

等級保護&#xff1a;直屬管理公安局 產品必須通過公安局安全許可證分級保護&#xff1a;直屬管理保密局 產品必須通過保密局銷售許可證等級保護&#xff1a;一般分為5級&#xff0c;目前最高用到是等保4級總概&#xff1a;定級——前期調研——總…