- 浏览: 222208 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
15197442045:
求demo,谢谢
IOS 后台执行代码(voip socket) -
15197442045:
我用了你这种方式,还是不能后台运行~~~~~
IOS 后台执行代码(voip socket) -
wlpych:
这个m_socket,从哪获得啊,什么方法?用的pjsip。求 ...
IOS 后台执行代码(voip socket)
Ios4已经直接支持blocks,很有必要学习一下。
在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
Blocks的定义:
int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};
定义了一个Multiply的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,注意{}blocks体里的;。
Blocks可以访问局部变量,但是不能修改。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
multiplier ++;//编译报错
return num * multiplier;
};
如果要修改就要加关键字:__block
__block int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
multiplier ++;//这样就可以了
return num * multiplier;
};
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
系统API中已经有很多支持blocks参数了
· Completion handlers
· Notification handlers
· Error handlers
· Enumeration
· View animation and transitions
· Sorting
例如:
[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)())animations]
集合体中也可以运用blocks。枚举一个数组时我们通常:
for (id obj in Array);
现在,
NSString *area = @"Europe";
NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];
NSMutableArray *areaArray = [NSMutableArray arrayWithCapacity:1];
NSIndexSet *areaIndexes = [timeZoneNames indexesOfObjectsWithOptions:NSEnumerationConcurrent
passingTest:^(id obj, NSUInteger idx, BOOL *stop) {
NSString *tmpStr = (NSString *)obj;
return [tmpStr hasPrefix:area];
}];
NSArray *tmpArray = [timeZoneNames objectsAtIndexes:areaIndexes];
[tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[areaArray addObject:[obj substringFromIndex:[area length]+1]];
}];
NSLog(@"Cities in %@ time zone:%@", area, areaArray);
在blocks中obj就是数组中的每个成员,我们就可以在blocks内对每个对象进行处理。再比如:
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
[mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
}];
NSLog(@"%@",mArrayCount);
你会发现,这样写代码更容易读懂。
最后,看一个排序的例子:
NSArray *stringsArray = [NSArray arrayWithObjects:
@"string 1",
@"String 21",
@"string 12",
@"String 11",
@"String 02", nil];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSComparator finderSort = ^(id string1, id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};
NSLog(@"finderSort: %@", [stringsArray sortedArrayUsingComparator:finderSort]);
结果:finderSort: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。
Blocks的定义:
int (^Multiply)(int, int) = ^(int num1, int num2) {return num1 * num2;};
定义了一个Multiply的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,注意{}blocks体里的;。
Blocks可以访问局部变量,但是不能修改。
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
multiplier ++;//编译报错
return num * multiplier;
};
如果要修改就要加关键字:__block
__block int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
multiplier ++;//这样就可以了
return num * multiplier;
};
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时blocks里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
系统API中已经有很多支持blocks参数了
· Completion handlers
· Notification handlers
· Error handlers
· Enumeration
· View animation and transitions
· Sorting
例如:
[UIView animateWithDuration:(NSTimeInterval)duration animations:(void (^)())animations]
集合体中也可以运用blocks。枚举一个数组时我们通常:
for (id obj in Array);
现在,
NSString *area = @"Europe";
NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];
NSMutableArray *areaArray = [NSMutableArray arrayWithCapacity:1];
NSIndexSet *areaIndexes = [timeZoneNames indexesOfObjectsWithOptions:NSEnumerationConcurrent
passingTest:^(id obj, NSUInteger idx, BOOL *stop) {
NSString *tmpStr = (NSString *)obj;
return [tmpStr hasPrefix:area];
}];
NSArray *tmpArray = [timeZoneNames objectsAtIndexes:areaIndexes];
[tmpArray enumerateObjectsWithOptions:NSEnumerationConcurrent|NSEnumerationReverse
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[areaArray addObject:[obj substringFromIndex:[area length]+1]];
}];
NSLog(@"Cities in %@ time zone:%@", area, areaArray);
在blocks中obj就是数组中的每个成员,我们就可以在blocks内对每个对象进行处理。再比如:
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
[mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
}];
NSLog(@"%@",mArrayCount);
你会发现,这样写代码更容易读懂。
最后,看一个排序的例子:
NSArray *stringsArray = [NSArray arrayWithObjects:
@"string 1",
@"String 21",
@"string 12",
@"String 11",
@"String 02", nil];
static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
NSWidthInsensitiveSearch | NSForcedOrderingSearch;
NSLocale *currentLocale = [NSLocale currentLocale];
NSComparator finderSort = ^(id string1, id string2) {
NSRange string1Range = NSMakeRange(0, [string1 length]);
return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
};
NSLog(@"finderSort: %@", [stringsArray sortedArrayUsingComparator:finderSort]);
结果:finderSort: (
"string 1",
"String 02",
"String 11",
"string 12",
"String 21"
)
发表评论
-
UIWebView清空缓存
2016-07-25 10:03 506- (void)clearAllUIWebViewData { ... -
iOS显示FPS值的工具FHHFPSIndicator
2016-07-04 13:56 0转载:http://www.cocoachina.com/io ... -
响应者链及相关机制总结
2016-06-30 14:25 502转载:http://www.cocoachina.com/i ... -
KVO&KVC的再次认知
2015-02-02 16:01 698KVO模型中,有两种通知观察者的方式,自动通知和手动通知。顾名 ... -
代码重构的理解(持续更新)
2015-01-13 17:27 579代码重构的理解和思考。 1:何时进行重构?当重复出现的时候,你 ... -
深入浅出Cocoa之Framework(转)
2015-01-06 17:49 0Framework 简介 转自 http://www.coc ... -
iOS静态库和动态库
2014-12-24 17:55 799一、什么是库? 库是共 ... -
svg图片在ios上的使用
2014-12-23 15:22 7151:从UI设计师那里得到的是每个svg图通过网站icomoon ... -
svg图片在ios上的使用
2014-12-23 15:22 32471:从UI设计师那里得到的是每个svg图通过网站icomoon ... -
Xcode设置项之Architectures和Valid Architectures
2014-12-22 10:42 618本文所讲的内容都是围绕iPhone的CPU指令集,现在先说说不 ... -
Xcode中Build Settings更改编译后能发现的问题
2014-12-17 13:36 7331:for循环不加括号 2:枚举赋值时类型不匹配 3:for循 ... -
静态库编译心得
2014-12-16 11:16 513我们编译静态库时一般会生成模拟器,真机两个包的.a文件 这二个 ... -
xcode编译选项整理
2014-12-11 19:15 0LINK_WITH_STANDARD_LIBRARIES = ... -
根据dsym解析crash_log
2014-12-01 14:15 9111:拷贝symbolicatecrash到/bin目录下 su ... -
autolayout心得
2014-10-28 13:30 680一:实现方案在以前就已经确定了下面几个点: 1 使 ... -
Objective-C的消息传递机制[转]
2014-07-31 20:34 654一直想写一篇类似的。 直接转载了 http://www.cnb ... -
iOS开发模拟限速
2012-12-07 17:47 53831. 模拟器网速调整: 限制时输入下面两行,根据需要修改下面的 ... -
iphone中结束电话后返回自己的应用(转载)
2012-04-10 10:30 1192iphone中结束电话后返回自己的应用 大家想不想在 ... -
Info.plist中常用的key简介(转载)
2012-03-15 15:55 933UIRequiresPersistentWiFi 在程序中弹出 ... -
UIScrollView 原理(转载)
2012-03-10 19:46 1158scroll view 原理 在滚动过程当中,其实是在修 ...
相关推荐
该文档简单的介绍了ios下block是的使用方法和一些小技巧
在iOS开发中,Block被广泛应用于异步操作、回调函数、枚举器等场景,提供了简洁的语法和高效的代码组织方式。下面我们将深入探讨Block的用法、例子以及其底层原理。 一、Block的用法 1. 声明Block类型:Block可以...
在iOS开发中,Block回调的使用尤其常见,特别是在界面跳转和数据交互的场景下。本篇文章将深入探讨iOS中Block的回调使用及其内部实现原理。 首先,让我们通过一个简单的例子来理解Block回调的实现。在例子中,我们...
在iOS开发中,Block是一种强大的、灵活的代码封装机制,它允许我们定义并存储局部的代码块,可以在需要时执行。Block在Objective-C和Swift中都得到了广泛的应用,尤其是在处理异步操作、事件回调和数据过滤等场景下...
在iOS开发中,Block是一种强大的特性,它允许你定义并存储一段可执行的代码,可以在需要的时候方便地调用。Block被苹果引入是为了提供一种更简洁、更灵活的方式来处理回调、异步操作以及复杂的逻辑控制。以下是关于...
在iOS开发中,Block是一种强大的代码组织和回调机制,它允许我们把代码块作为一个对象来传递,这在处理异步操作、事件响应或者简化复杂的逻辑时特别有用。"ios-block 回调.zip"中的"CallbackDemo"很可能是展示了一个...
在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义小型、自包含的代码块,可以作为参数传递,也可以返回。"ios-block 多参数传值.zip"这个压缩包显然是一个关于如何使用Block来传递多个参数的示例项目。...
这样,我们可以在Block中处理这些结果,无需编写复杂的回调函数。 Block回调的一个重要特性是它可以捕获和使用其定义时的作用域内的变量,这被称为“封闭”(closing over)。但需要注意的是,如果Block引用了循环...
因此,使用时应谨慎处理Block中的强引用循环,确保及时释放不再使用的资源。 总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,...
- 避免在Block中大量编写复杂逻辑,保持Block简洁。 - 使用清晰的Block参数和返回值类型,提高代码可读性。 - 使用`@autoreleasepool`在Block内部管理临时对象的内存。 通过以上内容的学习,你将对iOS中的Block...
例如,在网络请求中,我们可能在回调Block中处理接收到的数据: ```objc [AFNetworking GET:@"https://example.com/data" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable response...
在这个名为"ios-block逆传值页面间的.zip"的资源中,我们主要关注的是如何使用Block来实现页面间的反向传值。Block是Objective-C和Swift中的一种强大的特性,它可以作为参数传递,也可以作为返回值。对于初学者来说...
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...
在iOS开发中,Block是一种强大的特性,它允许程序员封装一段可执行的代码并作为一个对象进行传递。Block在很多场景下都非常有用,例如处理并发、异步回调、动画控制、集合遍历以及网络请求的响应处理等。理解Block...
在iOS开发中,Block是一种强大的、灵活的代码封装机制,它允许我们定义并存储一段可执行的代码,可以在需要的时候调用。Blocks是Objective-C的语法扩展,后来也被引入到Swift中,对于处理异步操作、事件回调、简化...
在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义匿名函数,即不关联任何特定方法或函数的代码块。Block不仅可以作为局部变量、函数参数,还可以用于回调,这正是"IOS block回调代码实例Demo"所展示的...
当DataSource直接包含在ViewController的Block中时,Block会捕获其所在上下文的强引用,可能导致ViewController无法正常释放。此外,这样的设计使代码难以维护,不易于测试和扩展。 为了解决这些问题,我们可以创建...
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可嵌套的匿名函数。Block不仅可以简化复杂的代码结构,还可以实现回调机制,使得异步操作变得简单易懂。本篇文章将深入探讨iOS Block的基本用法以及...