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