Block

来源:http://www.cnblogs.com/EchoHG/archive/2017/06/14/7007975.html
-Advertisement-
Play Games

Block簡介 Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數的傳遞等。用過GCD就知道Block的精妙之處。 Block是一種比較特殊的數據類型。它可以保存一段代碼,在合適的時候取出來調用。 Block的修飾 ARC情況下 1.如果用copy修飾Block,該Block就會存儲 ...


Block簡介

Block使用場景,可以在兩個界面的傳值,也可以對代碼封裝作為參數的傳遞等。用過GCD就知道Block的精妙之處。

 

Block是一種比較特殊的數據類型。它可以保存一段代碼,在合適的時候取出來調用。

 

 

Block的修飾

ARC情況下

1.如果用copy修飾Block,該Block就會存儲在堆空間。則會對Block的內部對象進行強引用,導致迴圈引用。記憶體無法釋放。

解決方法:

新建一個指針(__weak typeof(Target) weakTarget = Target )指向Block代碼塊里的對象,然後用weakTarget進行操作。就可以解決迴圈引用問題。

2.如果用weak修飾Block,該Block就會存放在棧空間。不會出現迴圈引用問題。

MRC情況下

用copy修飾後,如果要在Block內部使用對象,則需要進行(__block typeof(Target) blockTarget = Target )處理。在Block裡面用blockTarget進行操作。

 

typedef int (^SumP)(int,int);//用typedef定義一個block類型

 

//利用typedef定義block來創建一個block變數

   SumP sumblock1 = ^(int a,int b){

       return a - b;

    };

   int d = sumblock1(10,5);

    NSLog(@"d = %d",d);

 

 

Block的定義格式

返回值類型(^block變數名)(形參列表) = ^(形參列表) {

};

調用Block保存的代碼

block變數名(實參);

預設情況下,Block內部不能修改外面的局部變數
Block
內部可以修改使用__block修飾的局部變數

Block的模式

1.無參數無返回值的Block

2.有參數無返回值的Block

3.有參數有返回值的Block

 

Block簡單用法舉例

無參數無返回值的Block

/**

 *  無參數無返回值的Block

 */

-(void)func1{

    /**

     *  void :就是無返回值

     *  emptyBlock:就是該block的名字

     *  ():這裡相當於放參數。由於這裡是無參數,所以就什麼都不寫

     */

    void (^emptyBlock)() = ^(){

        NSLog(@"無參數,無返回值的Block");

    };

    emptyBlock();

}

 

 

有參數無返回值的Block

/**

     *  調用這個block進行兩個參數相加

     *

     *  @param int 參數A

     *  @param int 參數B

     *

     *  @return 無返回值

     */

    void (^sumBlock)(int ,int ) = ^(int a,int b){

        NSLog(@"%d + %d = %d",a,b,a+b);

    };

    /**

     *  調用這個sumBlock的Block,得到的結果是20

     */

    sumBlock(10,10);

 

 

有參數有返回值的Block

/**

     *  有參數有返回值

     *

     *  @param NSString 字元串1

     *  @param NSString 字元串2

     *

     *  @return 返回拼接好的字元串3

     */    

    NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){

        return [NSString stringWithFormat:@"%@%@",str1,str2];

    };

    //調用logBlock,輸出的是 我是Block

    NSLog(@"%@", logBlock(@“我是",@"Block"));

 

 

Block結合typedef使用

自己定義一個Block類型,用定義的類型去創建Block,更加簡單便捷。

這裡舉例一個Block回調修改上一下界面的背景顏色。

ViewController1 控制器1,ViewController2 控制器2

控制器1跳轉到控制器2,然後在控制器2觸發事件回調修改控制器1的背景顏色為紅色。

 

Demo

ViewController2的實現

#import <UIKit/UIKit.h>

@interfaceViewController2 : UIViewController

/**

 *  定義了一個changeColorBlock。這個changeColor必須帶一個參數,這個參數的類型必須為id類型的

 *  無返回值

 *  @param id

 */

typedefvoid(^changeColor)(id);

/**

 *  用上面定義的changeColor聲明一個Block,聲明的這個Block必須遵守聲明的要求。

 */

@property (nonatomic, copy) changeColor backgroundColor;

@end

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //聲明一個顏色

    UIColor *color = [UIColor redColor];

    //用剛剛聲明的那個Block去回調修改上一界面的背景色

    self.backgroundColor(color);

}

 

 

ViewController1的實現

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    ViewController2 *vc =[[ViewController2 alloc]init];

    // 回調修改顏色

    vc.backgroundColor = ^(UIColor *color){

        self.view.backgroundColor = color;

    };

    [self.navigationController pushViewController:vc animated:YES];

}


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

-Advertisement-
Play Games
更多相關文章
  • 驗證碼 ...
  • ——基於es6:Promise/A+ 規範簡單實現 非同步流程式控制制思想 前言: nodejs強大的非同步處理能力使得它在伺服器端大放異彩,基於它的應用不斷的增加,但是非同步隨之帶來的嵌套、難以理解的代碼讓nodejs看起來並沒有那麼優雅,顯得臃腫。類似於這樣的代碼: 上面的代碼 println中定義了va ...
  • 隨著Android的蓬勃發展, CPU的架構也越來越多. 早期只支持ARMv5, 截至目前, 支持的架構已達三類七種: ARM(ARMv5,ARMv7 (從2010年起),ARMv8), x86(x86 (從2011年起),x86_64 (從2014年起)) ,MIPS(MIPS (從2012年起) ...
  • 電池標稱電壓 定義如下圖, 以25度為例,20度再往上點, 4V 放一下電就往下掉, 3V 放一下電就往下掉, 假設 3.8V 是擁有最多 capacity 可以 discharge 的電壓,放電放了很久仍維持 3.8V, 因此我們定義 3.8V 為這顆電池的標稱電壓,(不同型號的電池也許不一樣) ...
  • Apple取消了oc的指針以及其他不安全的訪問的使用,捨棄的smalltalk語法,全面改為點語法,提供了類似java的命名空間 範型 重載; 首先我們瞭解一下Swift這門語言。Swift就像C語言一樣,使用變數來進行存儲並通過變數名來關聯值。在swift中廣泛的使用著不可變的變數,也就是我們常說 ...
  • Origin 一顆電池被拉載後,會產生電流及電壓如下圖, 如何計算其電池內阻呢 其公式為 R = |delta(V) / delta(I)| 公式推導如下: V1 = 10 I1R 左圖 V2 = 10 I2R 右圖 === 10 = V1 + I1R 10 = V2 + I2R === V1 + ...
  • 上一篇博文寫的是Picasso基本使用和源碼完全解析,Picasso的源碼閱讀起來還是很順暢的,然後就想到Glide框架,網上大家也都推薦使用這個框架用來載入圖片,正好我目前的寫作目標也是分析當前一些流行的框架源碼,那就也來解析下Glide的源碼吧,而且有了Picasso源碼的分析相信很快就搞定Gl... ...
  • 轉載文章地址:http://www.jianshu.com/p/27ba2759b221 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...