Block

1、認識Block

Block封裝了一段代碼,可以在任何時候執行
Block可以作為函數參數或者函數的返回值,而其本身又可以帶輸入參數或返回值,它和傳統的函數指針很類似,但是有區別:block是inline(內聯函數)的,并且默認情況下它對局部變量是只讀的
蘋果官方建議盡量多用block。在多線程、異步任務、集合遍歷、集合排序、動畫轉場用的很多
2、Blocks的定義
 1 //Blocks的定義:
 2 int (^MySum)(int, int) = ^(int a, int b) {
 3     return a+b;
 4 };
 5 //定義了一個叫MySum的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現
 6 //Block可以訪問局部變量,但是不能修改。
 7 int sum = 10;
 8 int (^MyBlock)(int) = ^(int num) {
 9     sum++;//編譯報錯
10     return num * sum;
11 };
12 //如果要修改就要加關鍵字:__block
13 __block int sum = 10;

  Block可以訪問局部變量,但是不能修改,若要修改就要加關鍵字:__block(兩個下劃線)  如:

1 __block int c = 15;        //__block 有兩個下劃線
2 MySum sum = ^(int a, int b)        //聲明了一個block變量
3 {
4     c = 19;//如果外部的變量用了__block關鍵字,就可以在block內部修改這個變量
5     NSLog(@”c is %i”, c);    //block可以訪問外面定義的變量
6 }; 

3、Blocks和函數、指針對比

 1 //定義函數指針
 2 int (*myFn)();
 3 
 4 //定義Blocks
 5 int (^MyBlocks)(int,int);
 6 
 7 //調用函數指針
 8 (*myFn)(10, 20);
 9 
10 //調用Blocks
11 MyBlocks(10, 20);

  Block、函數、指針三種方式實現兩個數相加 下圖:

  

  或者通過typedef(用于定義類型)定義類型后實現兩數相加:

 1 void test1() {
 2     // 定義了Sum這種Block類型
 3     typedef int (^Sum) (int, int);
 4     // 定義了sump這種指針類型,這種指針是指向函數的
 5     typedef int (*Sump) (int, int);
 6     // 定義了一個block變量
 7     Sum sum1 = ^(int a, int b) {
 8         return a + b;
 9     };
10     int c = sum1(10, 10);
11     NSLog(@"%i", c);
12     // 定義一個指針變量p指向sum函數
13     Sump p = sum;
14     // c = (*p)(9, 8);
15     c = p(9, 8);
16     NSLog(@"%i", c);
17 }

4、Blocks的賦值

1 //在聲明的同時定義變量,然后賦值
2 int (^MySum)(int,int) = ^(int a,int b) {
3     return a + b;
4 };
5 //也可先用typedef先聲明類型,再定義變量進行賦值
6 typedef int (^MySum)(int,int);
7 MySum sum = ^(int a,int b) {
8     return a + b;
9 }; 

?

轉載于:https://www.cnblogs.com/CJDog/p/5116418.html

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

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

相關文章

堅持學習WF(8):本地服務之調用外部方法

WF提供了一組核心服務,例如在SQL 數據庫中存儲工作流實例的執行詳細信息的持久性服務,計劃服務,事務服務和跟蹤服務。除了這些WF也提供了另外一種服務,叫做Local Service也可以叫做Data exchange service。主要是實現工作流和宿主…

c++歸并排序_合并排序法

一、合并排序(Merge Sort) 就是將多個有序數據表合并成一個有序數據表。如果參與合并的只有兩個有序表,那么稱為二路合并。對于一個原始的待排序序列,往往可以通過分割的方法來歸結為多路合并排序。二、一個待排序的原始數據序列進行合并排序的基本思路是…

golang json數組拼接

2016年06月16日 15:38:25 閱讀數:2575 標簽: golang json 數組 更多 個人分類: golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php課程設計實驗心得,PHP程序設計教程實驗及課程設計

部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print語句1.6 數據類型1.7 字符串函數1.8 常量1.9 運算符1.10 條件語句1.11 Switch語句1.12 循環語句1.13 函數部分 教程1 基礎教程1.1 簡介1.2 WampServer安裝1.3 PHP語法1.4 變量1.5 echo和print…

DRUID連接池的簡單使用

DRUID——為監控而生的DB池 1. DRUID介紹 DRUID是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日志監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池…

微習慣雖好,但是最重要的還是堅持

2019獨角獸企業重金招聘Python工程師標準>>> “微習慣”一詞是由美國的斯蒂芬蓋斯提出的。他以前是個宅男,懶蟲,為了改變自己而找到了這個方法。并且在自己身上實驗成功。養成了好的讀書、寫作和健身的習慣,實現了人生的華麗轉身。…

php手機端多圖預覽上傳,JS實現多圖預覽上傳的實例代碼

這篇文章主要介紹了JS實現多張圖片預覽同步上傳功能的相關資料,需要的朋友可以參考下廢話不多說了,直接給大家貼代碼了,具體代碼如下所示:/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

帶你了解zabbix整合ELK收集系統異常日志觸發告警~

今天來了解一下關于ELK的“L”-Logstash,沒錯,就是這個神奇小組件,我們都知道,它是ELK不可缺少的組件,完成了輸入(input),過濾(fileter),output(輸…

用python設計學生管理系統_Python實現GUI學生信息管理系統

本文實例為大家分享了Python實現GUI學生信息管理系統的具體代碼,供大家參考,具體內容如下 項目環境: 軟件環境: OS:RedHat6.3 Lib:Pygtk Language:Python Support tool:Glade3 項目簡述: ①Glade3設計用戶的登錄窗口,功…

http響應頭設置

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 設置響應頭數據response.setHeader(null, "HTTP/1.1 200 OK");response.setHeader("Server", "Apache-Coyote/1.1"…

java用數組實現單詞計數,MapReduce實現單詞計數原理及Java編程:WordCount

MapReduce實現單詞計數:WordCount單詞計數的文本信息(hello.txt):hello can i help youi have a dreammaybe you can help me? 實現過程:? Map過程:并行讀取文本,對讀取的單詞進行Map操作,每個詞將會形成…

python理論知識選擇題_Python基礎自測題答案和基礎知識梳理

Python基礎自測題答案和基礎知識梳理 1.關于Python中的lambda表達式的函數體自能是單獨一條語句,所以答案選擇C。 例如:>>>g lambda x: 2*x1 g(3) 7 2.Python中的變量不需要事先聲明,但是需要創建和賦值,否則你怎么用&a…

STM32f4 ARM Bootloader

參考資料: 基于ARM 的嵌入式系統Bootloader 啟動流程分析 Bootloader 詳解 ( 代碼環境 | ARM 啟動流程 | uboot 工作流程 | 架構設計) Android系統啟動流程 -- bootloader 在main()之前,IAR都做了啥? STM32 IAP程序 源碼 和測試代碼 有詳細的…

查找算法之順序查找

參考: 1. 順序查找 | 博客園 基本思想: 順序查找,就是從第一個元素開始,按索引順序遍歷待查找序列,直到找出給定目標或者查找失敗。 特點: 1. 對待查序列(表)無要求 -- 待查找序列可…

matlab kfda,SVD與KFDA相結合人臉識別-matlab-畢業論文

XXXXxx畢業設計(論文)最高達到88%。當在抽取的特征維數為39,PCA空間的投影維數為110的情況下,隨著訓練樣本個數的增加,LDA的識別情況如表4所示表4 ORL人臉庫LDA測試結果(2)訓練樣本數 識別率/% 識別時間/S3 68.2 52.3594 87.92 31.5315 88.00…

python數據預測_python時間序列預測股票走勢

提示:這只是個訓練模型,技術不具備實際意義,入市需謹慎。 首先調用tushare包 import tushare as ts import pandas as pd import matplotlib.pyplot as plt 查自己比較感興趣的股票,這里我查找的是新能源/燃料電池/氫燃料&#xf…

30.Android之百度地圖簡單學習

今天用了下百度地圖,簡單寫了一個例子,記錄下。 一、申請AK(API Key) 要想使用百度地圖sdk,就必須申請一個百度地圖的api key。申請流程挺簡單的。 首先注冊成為百度的開發者,然后打開http://lbsyun.baidu.…

在datatable中,在指定位置插入列

假如dataset ds 里面已經存在了數據,當我們想在datatable中插入一列數據,可以用以下方法實現:ds.Tables[0].Columns.Add("star");ds.Tables[0].Columns["star"].SetOrdinal(0);這樣“star”列就添加到datatable的第一列了…

python爬取b站彈幕_爬取B站彈幕并且制作詞云

目錄 SRE實戰 互聯網時代守護先鋒,助力企業售后服務體系運籌帷幄!一鍵直達領取阿里云限量特價優惠。 爬取彈幕 1. 從手機端口進入網頁爬取找到接口 2.代碼 import requests from lxml import etree import numpy as np urlhttps://api.bilibili.com/x/v1…