`

iOS Block学习

 
阅读更多

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学习总结demo

    iOS Block使用教程

    iOS的block是学习的难点和重点,熟练使用block可以达到代码的简单高效,特别是在网络的使用过程中。Block demo是一个简单易学的,可以便于学习原理。

    iOSblock方法的详细学习

    iOSblock方法的详细学习 指针函数和block的比较 详细自定义block

    iOS学习——block深入浅出-代码

    iOS学习——block深入浅出博文中的代码 博文地址:http://blog.csdn.net/u010127917/article/details/49946527

    iOS block实现,内存管理 翻译学习

    iOS开发中blcok一直用,但是不清除到底是怎么实现的,为什么有这么神奇的功能.看到一本英文书之后,方知block的实现是这样,所以翻译了一下blcok的相关章节.

    Block学习ios开发

    Block的学习以及深入学习,适合初学者使用

    iOS利用Block逆向传值的方式详解

    大家应该都有所了解在iOS开发中,常见的几种逆向传值方式,有代理(delegate)、通知(NSNotification),block等等,之前已经给大家介绍了通过代理实现逆向传值的方法,这篇文章来给大家介绍如何通过Block进行逆向...

    iOS中block变量捕获原理详析

    主要给大家介绍了关于iOS中block变量捕获原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    iOS调试Block引用对象无法被释放的小技巧分享

    主要给大家分享介绍了关于iOS调试Block引用对象无法被释放的小技巧,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    iOS Block解开多年以来一直的误解

    主要给大家介绍了关于iOS Block多年以来一直的误解如何解开的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    ios开发block反向传值

    页面间反向传值,对比了各种方法感觉用block的方式是最方便的。

    iOS通过block在两个页面间传值的方法

    不知道大家有没有发现,在实际开发中使用block的地方特别多,block比delegate和notification有着更简洁的优势,下面这篇文章我们来简单了解一下block在两个页面之间的传值。有需要的朋友们可以参考借鉴,下面来一起...

    一篇文章让你看懂IOS中的block为何再也不需要WeakSelf弱引用

    主要给大家介绍了关于IOS中block为何再也不需要WeakSelf弱引用的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    iOS中block的定义与使用

    苹果官方文档声明,block是objc对象。下面这篇文章主要给大家介绍了关于iOS中block的定义与使用,文中通过示例代码介绍的非常详细,对各位iOS开发者具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    《iOS传感器应用开发最佳实践》源码

    本书是我们智捷iOS课堂团队编写iOS系列丛书中的一本,目的是使一个有iOS开发基础的程序员通过本书的学习,能够开发iOS 硬件访问和传感器应用的程序。另外,对于没有iOS开发基础读者,我们推荐先阅读我们已经出版的...

    2-79 弹球block it ios android.zip项目unity源码下载

    2-79 弹球block it ios android.zip项目unity源码下载2-79 弹球block it ios android.zip项目unity源码下载 1.适合学生学习研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    初识block之block入门

    block是在IOS5.0添加的新内容,在GCD编程中,有很多地方都是block的身影,希望大家一起学习,在IOS7强大的多任务处理中,一定能大展身手的

    iOS开发 notification在2个页面之间传值

    页面a点击 控件 打开页面 b,在页面b中输入内容,把值传回a中显示,传值机制使用 notification,初学者比看,学习xcode的好例子

    ios-深入了解Block.zip

    在cocochina上看到了一个 上传了 block 理解的 代码。稍微有点不完善,将其完善对比 再上传一份。我完善的只是冰山一角,有高手 再 完善 上传一下,让大家共同学习

    iOS(闭包)block传值详解

    主要介绍了iOS(闭包)block传值的相关知识以及代码分享,对此有兴趣的朋友可以学习下。

Global site tag (gtag.js) - Google Analytics