zoukankan      html  css  js  c++  java
  • blocks 学习(转)

    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"

    )

    原文出自http://www.cnblogs.com/scorpiozj/articles/1941006.html

  • 相关阅读:
    在X++中使用IoC/DI模式应对不断变化的客户需求
    Predicate<T>与Func<T, bool>泛型委托
    Windows Live Writer插件:在WLW中插入语法高亮代码
    学习C#和.NET的资源
    C#中事件的动态调用
    2008年全国软件工程大会论文集
    C#基础:接口(二)
    【转载】"变化"、"复用"、"抽象"、"稳定" 影响着软件设计模式,架构,开发方法
    【领域驱动设计】.NET实践:实体、值对象和数据传输对象
    RSS订阅之基本使用
  • 原文地址:https://www.cnblogs.com/lyanet/p/2871711.html
Copyright © 2011-2022 走看看