设为首页 加入收藏

TOP

Objective-C中的Block(块)详解
2014-11-23 21:31:40 来源: 作者: 【 】 浏览:6
Tags: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。


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表达式


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android解决使用findViewById时需.. 下一篇Objective-C的NSCopying协议

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: