1. 程式人生 > >iOS 程式碼塊(block)的使用

iOS 程式碼塊(block)的使用

程式碼塊本質上是和其他變數類似。既可以做變數使用,也可以當函式使用。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。
脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的程式碼)。
下圖是如何把塊變數賦值給一個變數的語法講解:


按照呼叫函式的方式呼叫塊物件變數就可以了。

蘋果官網的例子

int (^Multiply)(int, int) = ^(int num1, int num2) 
{
    return num1 * num2;
};
int result = Multiply(7, 4); // Result is 28.

1、引數是NSString*的程式碼塊

void (^printBlock)(NSString *x); 
printBlock = ^(NSString* str)
{
    NSLog(@"print:%@", str);
};
printBlock(@"hello world!");

執行結果是:print:hello world!

2、程式碼用在字串陣列排序

NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2) 
{ 
   return [string1 compare:string2];
}; 
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock]; 
NSLog(@"sortArray:%@", sortArray);

執行結果:sortArray:( "abc 05",    "abc 1",    "abc 12",    "abc 13",    "abc 21")

3、程式碼塊的遞迴呼叫

程式碼塊想要遞迴呼叫,程式碼塊變數必須是全域性變數或者是靜態變數,這樣在程式啟動的時候程式碼塊變數就初始化了,可以遞迴呼叫

static void (^ const blocks)(int) = ^(int i)
{ 
    if (i > 0) 
    {
        NSLog(@"num:%d", i);
        blocks(i - 1);
    }
}; 
blocks(3);
執行列印結果:

num:3

num:2

num:1

4、在程式碼塊中使用區域性變數和全域性變數

在程式碼塊中可以使用和改變全域性變數

int global = 1000;  
int main(int argc, const char * argv[])  
{  
    {  
        void(^block)(void) = ^(void)  
        {  
           global++;   
           NSLog(@"global:%d", global);  
       }; 
      block();   
      NSLog(@"global:%d", global);  
   }  
   return 0;  
}  

執行列印結果:

global:1001

global:1001

而區域性變數可以使用,但是不能改變。

int local = 500;  
void(^block)(void) = ^(void)  
{  
    local++;  
    NSLog(@"local:%d", local);  
};  
block();  
NSLog(@"local:%d", local); 

在程式碼塊中改變區域性變數編譯不通過。怎麼在程式碼塊中改變區域性變數呢?在區域性變數前面加上關鍵字:__block

__block int local = 500;  
void(^block)(void) = ^(void)  
{  
    local++;  
    NSLog(@"local:%d", local);  
};  
block();  
NSLog(@"local:%d", local);  

執行結果:local:501

local:501     "abc 1",    "abc 12",    "abc 13",    "abc 21"

相關推薦

iOS 程式碼(block)的使用

程式碼塊本質上是和其他變數類似。既可以做變數使用,也可以當函式使用。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可

一篇文章看懂iOS程式碼Block

iOS程式碼塊Block 概述 程式碼塊Block是蘋果在iOS4開始引入的對C語言的擴充套件,用來實現匿名函式的特性,Block是一種特殊的資料型別,其可以正常定義變數、作為引數、作為返回值,特殊地,Block還可以儲存一段程式碼,在需要的時候呼叫,目前Block已經廣泛應用於iOS開發

IOS 程式碼block的宣告、建立、傳參的基本使用

Block 是iOS在4.0之後新增的程式語法,在iOS SDK 4.0之後,block應用幾乎無處不在。 在其他語言中也有類似的概念稱做閉包(closure),比如object C的好兄弟Swift 中閉包(swift 閉包詳解)的使用跟 OC的block一樣

[ios開發基礎之]程式碼 ——block

iOS4引入了一個新特性,支援程式碼塊的使用, 這將從根本上改變你的程式設計方式。程式碼塊是對C語言的一個擴充套件,因此在Objective-C中完全支援。如果你學過Ruby,Python或Lisp程式設計 語言,那麼你肯定知道程式碼塊的強大之處。簡單的說,你可以通

iOS 程式碼block)使用基礎

       程式碼塊本質上是和其他變數類似。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。 脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的程式碼)

iOS 程式碼( 閉包 )基本語法

block 語法格式( OC ) 在 Xcode 裡面直接敲 block ( 或者 inlineBlock 的一部分 ) 然後敲回車 我們會發現有以下智慧提示: <#returnType#>(^<#blockName#>

Objective-C語法之程式碼(block)的使用

程式碼塊本質上是和其他變數類似。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。 脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的程式碼)。下圖是如何把塊

iOS block程式碼強引用問題

block程式碼塊在iOS開發中經常見到,例如AFN資料請求就是block,值得注意的是在block中不恰當的操作程式碼,會導致資源不被釋放,導致記憶體洩漏,例如下面的資料請求: __weak typeof(self) weakSelf = self; [

IOS學習之block程式碼

前言:    block這個名詞對於做一般開發者來說可能會覺得稀奇古怪而非常陌生,但是對於iOS工程師來說,在整個開發中到處都是它的影子,今天一大早覺得在假期學習一下它,對明年的iOS開發工作做個準備,突然有點找回當年即將畢業時的最後一個春節假期的感覺,今天基於最近使用的角

初探iOS中的Block程式碼與閉包)

支援原創,轉載請註明博主與博文連結,3Q   —— by atany 一、Block是什麼?        Block就是一個包含函式體的物件,有時候也被叫做閉包。        概念可能還是有

iOSBlock程式碼的定義及使用

不會使用Block的iOS程式設計師,不是一個合格的程式設計師 Block沒有你想象中的那麼難,不要害怕,不要畏懼,勇敢嘗試 Block進階: Block其實就是一個程式碼塊,把你想要執行的程式碼封裝在這個程式碼塊裡,等到需要的時候再去呼叫。 個人覺得

IOS開發 block程式碼)基本使用

1. block基本概念: (開篇廢話) Block是C級別的語法和執行時特性。Block比較類似C函式,但是Block比之C函式,其靈活性體現在棧記憶體、堆記憶體的引用。 Block是蘋果推薦的型別,效率高,可以幫助我們組織獨立的程式碼段,並提高複用性和

ios xcode 設定程式碼

在Xcode中自定義自己的快速程式碼,很簡單,用起來也很方便 首先選擇自己想要的自定義的程式碼塊 拖拽到紅框的區域鬆手,會彈出設定視窗 這是我的填寫 這裡有另外一個技巧,可以給自己想要改變的地方設定成預留字(預留字是我自己隨口胡鄒的名詞) 總之,如果你想把b

C++ Block程式碼

Block是什麼? Block是C語言的一個語法特性,同時也是C語言的執行時特性,它很像C中的函式指標,因為你可以像使用函式指標一樣的去使用block物件;它也很像C++中的函式物件,因為除了要執行的程式碼,block還可以攜帶和block繫結的狀態資訊。

iOS 使用巨集定義函式和程式碼

iOS使用巨集定義函式和程式碼塊 今天在開發過程中碰到一個問題:就是父類中要向外傳送通知,然後子類中或者其他類中來接收它。當然一般是把它寫到類方法中去,但是有個問題,就是如果呼叫的類不是它的子類,就不能直接呼叫,當然也可以採用靜態方法實現,我這裡主要是想用巨集

iOS-- xcode10 自定義程式碼的位置

自定義程式碼塊在Xcode中的路徑(方便下次換電腦時使用~) ~/Library/Developer/Xcode/UserData/CodeSnippets 程式碼塊都在某個檔案中,

iOS 註釋方法大全 程式碼加快捷鍵自定義註釋

註釋規範       良好的編碼規範是程式設計師必備的素質,編碼中的程式碼註釋尤為重要,健全的程式碼註釋可以提高程式碼可讀性和維護性,不僅為了標識此塊程式碼的含義,很多時候包含了對業務邏輯的解釋,專案中難免有邏輯複雜之處,不加註釋的程式碼,數日後自己看都會覺得陌生,更不

iOS開發之Xcode自定義程式碼遷移

本文介紹了程式碼塊遷移的過程. 背景:由於最近換了新的mac,所以,要做自定義程式碼塊的遷移. 一.Xcode中的程式碼塊. 二.開啟 Finder,快捷鍵Command +

iOS應用意見反饋程式碼

#pragma mark - 3.擷取兩個字串之間的文字,修改其顏色 /** * 3.擷取兩個字串之間的文字,修改其顏色 * * @param LongString 原來的字串 * @param beforeString 前面的字串 * @param

iOS-#ifdef DEBUG程式碼介紹

iOS-#ifdef DEBUG巨集定義介紹 一.#ifdef DEBUG程式碼塊 #ifdef DEBUG // Debug 模式的程式碼... #else // Release 模式的程式碼... #endif 二.#DEBUG定義