歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Objective-C中的Block(塊)詳解

Block初探

在Objective-c中NSArray是很常用的容器之一,很多時候我們需要對數組中的數據進行排序,因此與下面類似的代碼會經常碰到:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
 
    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
 
    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

剛接觸objc的朋友可能會對這段代碼表示看不懂,

sortedArrayUsingComparator: ^(id obj1, id obj2) {
    // 代碼省略
}];

這個以^開頭的參數類型為NSComparetor,原型如下 : 

typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);

其實這個Comparetor的功能就類似於C語言中的函數指針,以及C++11、Java 8 、C#等語言中的Lambda表達式。其返回值的類型為NSComparionResult,參數為兩個id類型的變量,類型名為NSComparetor。

Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm

Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm

使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm

10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm

Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm

C語言中的函數指針

我們首先來回顧一下C語言中的最簡單的函數指針,在C語言中我們以

 returntype (*name) (arg);

的格式定義一個函數指針變量。或者以 typedef的形式定義一個函數指針類型。示例代碼如下 : 

// C語言的函數指針聲明
int (*addInC)(int , int ) ;

// 聲明一個函數指針類型,類型名為AddOperation
typedef int (*AddOperation)(int, int);

// 普通C語言函數
int doAdd(int a, int b) {
    return a + b ;
}

//
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        // addInC指針變量指向doAdd函數
        addInC = doAdd;
        // 函數指針調用,實際上調用的是doAdd(5,6)
        NSLog(@" addInC : %i.", addInC(5, 6)) ;
        // 聲明一個aop函數指針變量,也指向doAdd
        AddOperation aop = doAdd ;
        NSLog(@" AddOperation : %i.", aop(100, 23) );
    }
    return 0;
}

輸出 : 

addInC : 11.
AddOperation : 123.

首先是生命一個函數指針,addInC,然後在main函數中將addInC指向doAdd函數,這樣調用addInC(5, 6)就等於調用了doAdd(5, 6)。同理AddOperation也是這個原理。Java 8中的Lambda表達式

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-09/106142p2.htm

Copyright © Linux教程網 All Rights Reserved