• 转 :iOS Block学习


    更多阅读请访问:http://www.hopean.com

    iOS4已经直接支持blocks,很有必要学习一下。

    在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline的,并且它对局部变量是只读的。

    Blocks的定义:

         int (^myBlock) (int a,int b) = ^(int a,int b){  
           return a+b;  
       };  

    定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?

    Blocks可以访问局部变量,但是不能修改。比如下面的代码就会报编译错 

    int num = 0;  
        //使用block   
        int (^myBlock) (int a,int b) = ^(int a,int b){  
            num = a+b;  
            return num;  
        };  

    如果要修改就要加关键字:__block (注意,是两个下划线"_")

    __block int num = 0;  
        //使用block   
        int (^myBlock) (int a,int b) = ^(int a,int b){  
            num = a+b;  
            return num;  
        };  

     作为函数的参数,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);

    你会发现,这样写代码更容易读懂。

    最后,看一个排序的例子:

     1     NSArray *stringsArray = [NSArray arrayWithObjects:
     2 
     3                              @"string 1",
     4 
     5                              @"String 21",
     6 
     7                              @"string 12",
     8 
     9                              @"String 11",
    10 
    11                              @"String 02", nil];
    12 
    13     static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |
    14 
    15     NSWidthInsensitiveSearch | NSForcedOrderingSearch;
    16 
    17     NSLocale *currentLocale = [NSLocale currentLocale];
    18 
    19     NSComparator finderSort = ^(id string1, id string2) {
    20 
    21         NSRange string1Range = NSMakeRange(0, [string1 length]);
    22 
    23         return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];
    24 
    25     };
    26 
    27     NSLog(@"finderSort: %@", [stringsArray sortedArrayUsingComparator:finderSort]);

    结果:finderSort: (

        "string 1",

        "String 02",

        "String 11",

        "string 12",

        "String 21"

    )

    原文连接:http://blog.csdn.net/weiqubo/article/details/8107999

  • 相关阅读:
    【LeetCode OJ】Longest Substring Without Repeating Characters
    JavaScript学习笔记一
    Struts2(五)数据校验
    Struts2(四)属性驱动和模型驱动
    php知识大集合(自用)
    正则表达式匹配非需要匹配的字符串(标题自己都绕晕了)
    php中ereg() ,preg_match() 与preg_match_all的区别?代码详细比较
    linux 查询当前文件夹下的目录数量
    linux 下如何查看mysql跑了哪些服务
    mysql同主机下 复制一个数据库所有文件到另一个数据库
  • 原文地址:https://www.cnblogs.com/hopeanCom/p/2748133.html
Copyright © 2020-2023  润新知