1. 程式人生 > >block的高階用法(一) -- block傳值

block的高階用法(一) -- block傳值

我們先從簡單的入手,先講下block的傳值,後面會有更精彩的。

在講傳值之前我們先複習下block的基礎知識:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    void(^block)() = ^() {
        NSLog(@"我被呼叫了");
    };
}
此時我定義了一個無返回值,無引數的block,當我執行的時候,沒有任何輸出。

當我加上一句程式碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    void(^block)() = ^() {
        NSLog(@"我被呼叫了");
    };
    
    block();
}
執行後,有了輸出,輸出如下:

前後對照著看很明顯是block()這句才取到呼叫函式的目的。這讓我們想起來了C語言中,我們通常在main函式外面來定義一個函式,然後在main函式內部呼叫:

#include <stdio.h>

void test() {
    printf("我被呼叫了");
}

int main(int argc, const char * argv[]) {
    
    test();
    return 0;
}
main函式中呼叫了宣告的test函式。

我們發現block跟C語言的方式非常類似。不同點就是宣告的方式不同:block可以在函式內部直接宣告,緊接在block的後面,block就像函式的指標。不像C語言一樣得單獨的寫成一塊來宣告函式

好了,我們現在說下今天的重點:

首先,我定義了兩個控制器FirstViewController和SecondViewController。

FirstViewController中有一個Label和一個按鈕,點選按鈕會跳轉到SecondViewController中,如圖所示:


SecondViewController中有一個textField的輸入框,效果如圖所示:


實現的效果是當我在SecondViewController中的textField中輸入字元,返回FirstViewController後會在裡面的label中顯示出來。

具體實現思路如下:

1.在SecondViewController.h中定義一個block:

#import <UIKit/UIKit.h>

/** 定義一個block */
typedef void(^blockName)(NSString *text);

@interface SecondViewController : UIViewController


//block在ARC中使用strong,非ARC中使用copy
@property (nonatomic, strong) blockName block;

@end

2.然後在返回FirstViewController的時候(為了方面此時我直接在- (void)viewWillDisappear:(BOOL)animated呼叫),實現block:

- (void)viewWillDisappear:(BOOL)animated {
    
    [super viewWillDisappear:animated];
    
    //判斷block是否為空
    if (_block) {
        _block(self.textField.text);
    }
}
3.在FirstViewController中定義block的具體實現:
- (void)buttonClick {
    
    SecondViewController *second = [[SecondViewController alloc] init];
    second.block = ^(NSString *text) {
        self.label.text = text;
    };
    
    [self.navigationController pushViewController:second animated:YES];
}
實現的效果:

返回後的效果:


實現了上述效果。

對block不是很瞭解的同學可能會有些懵,所以我用通俗的話總結下block的基礎知識:

1.在FirstViewController中我們只是寫了block中的具體實現,block中的程式碼並不會立即執行。

2.在SecondViewController中我們通過block()來呼叫實現block內部程式碼的執行。

考慮到大家純碎的看,估計不太好理解,我每次都會把原始碼拿出來,原始碼都在我的GitHub中,想要原始碼的點選這裡

相關推薦

block高階用法 -- block

我們先從簡單的入手,先講下block的傳值,後面會有更精彩的。 在講傳值之前我們先複習下block的基礎知識: - (void)viewDidLoad { [super viewDidLoa

很多人不瞭解的嵌入式C高階用法

本文來自網路 1、記憶體管理 我們需要知道——變數,其實是記憶體地址的一個抽像名字罷了。在靜態編譯的程式中,所有的變數名都會在編譯時被轉成記憶體地址。機器是不知道我們取的名字的,只知道地址。  記憶體的使用時程式設計中需要考慮的重要因素之一,這不僅由於系統記憶體是有限

7章 RxJava高階用法

CSDN學院課程地址 RxJava2從入門到精通-初級篇:https://edu.csdn.net/course/detail/10036 RxJava2從入門到精通-中級篇:https://edu.csdn.net/course/detail/10037

【深入Java基礎】HashMap高階用法:排序

HashMap高階用法(一):排序 根據key排序 HashMap是無序的,我們可以根據key進行升序或降序。 1.利用List和Collections來實現排序 先獲取HashMap的keySet,然後將keySet放入List,在由Collectio

IOS中 Block簡介與用法

Block簡介: Block的實際行為和Function很像,最大的差別是在可以存取同一個Scope的變數值。Block實體形式如下: ^(傳入引數列){行為主體}; Block實體開頭是“^”,接著是由小括號所包起來的引數列(比如 int a, int b, int c)

iOS底層原理總結 - 探尋block的本質

release nss 命令 static 斷點 fix 生成 什麽是 block類型 面試題 block的原理是怎樣的?本質是什麽? __block的作用是什麽?有什麽使用註意點? block的屬性修飾詞為什麽是copy?使用block有哪些使用

Linux基礎之常見命令用法

linux基礎命令入門(一)一、Linux文件目錄結構 在講述之前,先簡短的說說Windows文件結構,打開‘計算機’,看到的一個個的驅動器(盤符,例C盤、D盤等),點開其中任意盤符,看到的是一個個文件或文件夾,繼續打開...,每個盤都有自己的根目錄。若是把其打開過程畫下來,便可得到如下多棵倒樹並列的圖

博世感器調試筆記----加速度感器BMA253

cti 帶寬 配置 acc pmu 轉換 氣壓 檢測 dem 公司是bosch的代理商,最近一段時間一直在公司開發的傳感器demo板上調試bosch sensor器件。涉及到的器件有7,8款,類型包括重力加速度、地磁、陀螺儀、溫度、濕度、大氣壓力傳感器等。在調試的過程中做了

Redis Sentinel機制與用法

clear monitor 拒絕 coff failure abstract trac 用法 XML from:https://my.oschina.net/dyyweb/blog/513680 摘要: Redis Sentinel機制與用法(一) Sentin

golang 中io包用法

不同的 下一個 同時 顯示 cte () ews 執行 忽略 本文轉自Golove博客:http://www.cnblogs.com/golove/p/3276678.html io 包為I/O原語提供了基礎的接口.它主要包裝了這些原語的已有實現,如 os 包中的

tensorboard 用法

import tensorflow as tf import numpy as np ## prepare the original data with tf.name_scope('data'): x_data = np.random.rand(100).astype(np

ActiveMQ學習筆記15----Message Dispatch高階特性

1. Message Cursors   1.1 概述   ActiveMQ傳送持久化訊息的典型的厝裡方式是:當訊息的消費者準備就緒時,訊息傳送系統把儲存的訊息按批次傳送給消費者,在傳送完一個批次的訊息後,指標的標記位置指向下一個批次的待發訊息的位置,進行後續的傳送操作。這是一種 比較健壯和靈活的訊息傳送

ActiveMQ學習筆記19----Consumer高階特性

1. Exclusive Consumer   獨有消費者:Queue中的訊息是按照順序被分發到consumer的,然而,當你有多個consumers同時從相同的queue中提取訊息時,你將失去這個保證。因為這些訊息是被多個執行緒併發的處理。有的時候,保證訊息按照順序處理是很重要的。例如:你可能不希望在插入

python高階語法

文章目錄 GIL全域性直譯器鎖 什麼是GIL全域性直譯器鎖 執行緒何時會釋放GIL鎖 如何避免這種現象 多執行緒單執行緒的選擇 深拷貝~淺拷貝 按資料型別分類 1、 拷貝單一的可變

Python高階教程面向物件

Python 面向物件 Python從設計之初就已經是一門面向物件的語言,正因為如此,在Python中建立一個類和物件是很容易的。本章節我們將詳細介紹Python的面向物件程式設計。 如果你以前沒有接觸過面向物件的程式語言,那你可能需要先了解一些面嚮物件語言的一些基本特徵,在頭腦裡頭形

django之ORM介紹與基本用法

  一、ORM介紹 1.什麼是ORM ORM 全拼Object-Relation Mapping. 中文意為 物件-關係對映. 在MVC/MVT設計模式中的Model模組中都包括ORM 2.ORM優勢 (1)只需要面

.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法之 具體實現

工作需要,用到MongoDB,筆者也是邊學邊用,基於官方的驅動MongoDB.Driver的Aggregate具體用法,網上資料甚少,且部分實現記錄並不詳盡。也是邊學邊用,文中錯誤之處,請留言指正。 筆者在儲存和基本的時間範圍查詢時,都可以不使用聚合管道實現而使用約束器FilterDefinit

sql高階教程

1.Top語句 TOP 子句用於規定要返回的記錄的數目 SQL Server 的語法:SELECT TOP number|percent 行數 FROM 表名 mysql的語法:SELECT * FROM 表名 LIMIT 5(行數) oracl

MySQL中的關鍵字用法

MySQL中關鍵字的用法(一) Insert:增加 insert into * values() insert into user values(‘11’,‘諸葛亮’,‘1011’); 不多解釋,向表中新增一條語句,不清楚的去看MySQL的簡單的增刪改查

python裝飾器用法:計算一個函式執行所需要的時間

import time from functools import wraps def time_this_function(func): #作為裝飾器使用,返回函式執行需要花費的時間