iOS4已经直接支持blocks,很有必要学习一下。
在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
Blocks的定义:
定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?
Blocks可以访问局部变量,但是不能修改。比如下面的代码就回报编译错
如果要修改就要加关键字:__block (注意,是两个下划线"_")
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
系统API中已经有很多支持blocks参数了
·Completion handlers
·Notification handlers
·Error handlers
·Enumeration
·View animation and transitions
·Sorting
例如:
[UIViewanimateWithDuration:(NSTimeInterval)durationanimations:(void
(^)())animations]
集合体中也可以运用blocks。枚举一个数组时我们通常:
for (id obj in Array);
现在,
NSString*area =@"Europe";
NSArray*timeZoneNames = [NSTimeZoneknownTimeZoneNames];
NSMutableArray*areaArray = [NSMutableArrayarrayWithCapacity:1];
NSIndexSet*areaIndexes = [timeZoneNamesindexesOfObjectsWithOptions:NSEnumerationConcurrent
passingTest:^(idobj,NSUIntegeridx,BOOL*stop)
{
NSString*tmpStr = (NSString*)obj;
return[tmpStrhasPrefix:area];
}];
NSArray*tmpArray = [timeZoneNamesobjectsAtIndexes:areaIndexes];
[tmpArrayenumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse
usingBlock:^(idobj,NSUIntegeridx,BOOL*stop)
{
[areaArrayaddObject:[objsubstringFromIndex:[arealength]+1]];
}];
NSLog(@"Cities in %@ time zone:%@", area, areaArray);
在blocks中obj就是数组中的每个成员,我们就可以在blocks内对每个对象进行处理。再比如:
NSMutableArray*mArray = [NSMutableArrayarrayWithObjects:@"a",@"b",@"abc",nil];
NSMutableArray*mArrayCount = [NSMutableArrayarrayWithCapacity:1];
[mArrayenumerateObjectsWithOptions:NSEnumerationConcurrentusingBlock:
^(idobj,NSUIntegeridx,BOOL*stop){
[mArrayCountaddObject:[NSNumbernumberWithInt:[objlength]]];
}];
NSLog(@"%@",mArrayCount);
你会发现,这样写代码更容易读懂。
最后,看一个排序的例子:
NSArray*stringsArray = [NSArrayarrayWithObjects:
@"string 1",
@"String 21",
@"string 12",
@"String 11",
@"String 02",nil];
staticNSStringCompareOptionscomparisonOptions =NSCaseInsensitiveSearch|NSNumericSearch|
NSWidthInsensitiveSearch|NSForcedOrderingSearch;
NSLocale*currentLocale = [NSLocalecurrentLocale];
NSComparatorfinderSort = ^(idstring1,idstring2)
{
NSRangestring1Range =NSMakeRange(0,
[string1length]);
return[string1compare:string2options:comparisonOptionsrange:string1Rangelocale:currentLocale];
};
NSLog(@"finderSort: %@", [stringsArraysortedArrayUsingComparator:finderSort]);
结果:finderSort: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
分享到:
相关推荐
ios block学习总结demo
iOS的block是学习的难点和重点,熟练使用block可以达到代码的简单高效,特别是在网络的使用过程中。Block demo是一个简单易学的,可以便于学习原理。
iOSblock方法的详细学习 指针函数和block的比较 详细自定义block
iOS学习——block深入浅出博文中的代码 博文地址:http://blog.csdn.net/u010127917/article/details/49946527
iOS开发中blcok一直用,但是不清除到底是怎么实现的,为什么有这么神奇的功能.看到一本英文书之后,方知block的实现是这样,所以翻译了一下blcok的相关章节.
Block的学习以及深入学习,适合初学者使用
大家应该都有所了解在iOS开发中,常见的几种逆向传值方式,有代理(delegate)、通知(NSNotification),block等等,之前已经给大家介绍了通过代理实现逆向传值的方法,这篇文章来给大家介绍如何通过Block进行逆向...
主要给大家介绍了关于iOS中block变量捕获原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
主要给大家分享介绍了关于iOS调试Block引用对象无法被释放的小技巧,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要给大家介绍了关于iOS Block多年以来一直的误解如何解开的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
页面间反向传值,对比了各种方法感觉用block的方式是最方便的。
不知道大家有没有发现,在实际开发中使用block的地方特别多,block比delegate和notification有着更简洁的优势,下面这篇文章我们来简单了解一下block在两个页面之间的传值。有需要的朋友们可以参考借鉴,下面来一起...
主要给大家介绍了关于IOS中block为何再也不需要WeakSelf弱引用的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
苹果官方文档声明,block是objc对象。下面这篇文章主要给大家介绍了关于iOS中block的定义与使用,文中通过示例代码介绍的非常详细,对各位iOS开发者具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
本书是我们智捷iOS课堂团队编写iOS系列丛书中的一本,目的是使一个有iOS开发基础的程序员通过本书的学习,能够开发iOS 硬件访问和传感器应用的程序。另外,对于没有iOS开发基础读者,我们推荐先阅读我们已经出版的...
2-79 弹球block it ios android.zip项目unity源码下载2-79 弹球block it ios android.zip项目unity源码下载 1.适合学生学习研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
block是在IOS5.0添加的新内容,在GCD编程中,有很多地方都是block的身影,希望大家一起学习,在IOS7强大的多任务处理中,一定能大展身手的
页面a点击 控件 打开页面 b,在页面b中输入内容,把值传回a中显示,传值机制使用 notification,初学者比看,学习xcode的好例子
在cocochina上看到了一个 上传了 block 理解的 代码。稍微有点不完善,将其完善对比 再上传一份。我完善的只是冰山一角,有高手 再 完善 上传一下,让大家共同学习
主要介绍了iOS(闭包)block传值的相关知识以及代码分享,对此有兴趣的朋友可以学习下。