__block 和 __weak的區別

来源:http://www.cnblogs.com/MasterPeng/archive/2016/09/05/5841774.html
-Advertisement-
Play Games

Blocks理解: Blocks可以訪問局部變數,但是不能修改 如果修改局部變數,需要加__block 2、如果局部變數是數組或者指針的時候只複製這個指針,兩個指針指向同一個地址,block只修改指針上的內容。如: 例子裡面確實沒有修改mArrayCount這個局部變數啊。mArrayCount是一 ...


Blocks理解:

Blocks可以訪問局部變數,但是不能修改

如果修改局部變數,需要加__block

 

 __block int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//這樣就可以了
         return num * multiplier;
     };

 

 

2、如果局部變數是數組或者指針的時候只複製這個指針,兩個指針指向同一個地址,block只修改指針上的內容。如:

 

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
    NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
    [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
        [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
    }];
   
    NSLog(@"%@",mArrayCount);

例子裡面確實沒有修改mArrayCount這個局部變數啊。mArrayCount是一個指針,指向一個可變長度的數組。在block裡面,並沒有修改這個指針,而是修改了這個指針指向的數組。換句話說,mArrayCount是一個整數,保存的是一塊記憶體區域的地址,在block里,並沒有改變這個地址,而是讀取出這個地址,然後去操作這塊地址空間的內容。

這是允許的,因為聲明block的時候實際上是把當時的臨時變數又複製了一份,在block里即使修改了這些複製的變數,也不影響外面的原始變數。即所謂的閉包。

但是當變數是一個指針的時候,block里只是複製了一份這個指針,兩個指針指向同一個地址。所以,在block裡面對指針指向內容做的修改,在block外面也一樣生效。

 

__weak __typeof(&*self)weakSelf =self; 等同於

__weak UIViewController *weakSelf =self;

為什麼不用__block 是因為通過引用來訪問self的實例變數 ,self被retain,block也是一個強引用,引起迴圈引用,用__week是弱引用,當self釋放時,weakSelf已經等於nil。

擴展:NSTimer註意避免迴圈引用的地方,需要找個合適的時機和地方來 invalidate timer

 

在引用計數的環境裡面,預設情況下當你在block裡面引用一個Objective-C對象的時候,該對象會被retain。當你簡單的引用了一個對象的實例變數時,它同樣被retain。但是被__block存儲類型修飾符標記的對象變數不會被retain

註意:在垃圾回收機制裡面,如果你同時使用__weak和__block來標識一個變數,那麼該block將不會保證它是一直是有效的。 如果你在實現方法的時候使用了block,對象的記憶體管理規則更微妙:也是(__weak與__block區別:)

1、如果你通過引用來訪問一個實例變數,self會被retain。
2、如果你通過值來訪問一個實例變數,那麼變數會被retain

 

 

__weak主要適用於避免迴圈引用    , 如何避免請見博文:http://www.cnblogs.com/MasterPeng/p/5311911.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、引言 如今,Android+html5開發已經成為最流行的開發模式。 Android 中可以通過webview來實現和js的交互,在程式中調用js代碼,只需要將webview控制項的支持js的屬性設置為true Android(Java)與JavaScript(HTML)交互有四種情況: 1) A ...
  • 新版中的TimePicker DatePicker是不支持使用遙控器的, 恢覆成低版本滾動模式只需要是xml文件加上一句即可: 本文為博主原創文章,轉載請註明出處 http://www.cnblogs.com/rencm/p/5842798.html ...
  • 1、Android 中的Json解析工具fastjson 、序列化、反序列化 2、Android Gson的使用總結 3、Android-JSONTool 一個簡易的Json框架類,小到只有一個類 有時為了簡化代碼的大小,儘可能的壓縮apk的大小。就不能再使用大而全的框架了。 ...
  • 一:理論知識點 1:什麼是FlexBox佈局? 彈性盒模型(The Flexible Box Module),又叫Flexbox,意為“彈性佈局”,旨在通過彈性的方式來對齊和分佈容器中內容的空間,使其能適應不同屏幕,為盒裝模型提供最大的靈活性。 Flex佈局主要思想是:讓容器有能力讓其子項目能夠改變 ...
  • 1、概念 Gson是谷歌發佈的一個json解析框架 2、如何獲取 github:https://github.com/google/gson android studio使用 查看 最新版本號 下載最新的jar包 ,http://search.maven.org/#search%7Cga%7C1%7 ...
  • 使用系統自帶生成/掃描二維碼iOS7開始蘋果集成了二維碼的生成的掃描### 生成二維碼的步驟導入CoreImage框架 #import 通過濾鏡CIFilte生成二維碼### 二維碼的內容(傳統的條形碼只能放數字)純文本名片URL生成二維碼 // 1.創建過濾器 CIFilter *filter =... ...
  • 1、Android一整套圖片解決方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1&sn=c9670674dcfb71a24521e898776f234e&scene=1&srcid=0905yknSzNO ...
  • 在這篇文章里,我會介紹下Glide中的一些關鍵概念,並走一遍圖片載入流程,如果你要閱讀Glide源碼的話,應該多少會有點幫助。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...