现在的位置: 首页 > 综合 > 正文

iOS Block -浅析

2013年12月11日 ⁄ 综合 ⁄ 共 4110字 ⁄ 字号 评论关闭
Block 的使用有两种:1.独立Block 。2.内联Block 。
《一》独立Block 使用方式
一、定义一个Block Object,并调用。
1.定义

// 定义一个Block Object,返回值:NSString;别名:intToString;参数:NSUInteger

NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){

    NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];

    return result;

};

2.调用

// 调用我们定义的Block Ojbect

NSString *string = intToString(10);

NSLog(@"string = %@", string);

二、将Block Object 当作参数,在方法之间传递,调用。
有时候,我们希望将定义的Block Object作为函数的参数使用,就像其他的数据类型一样。

1.为Block Object 定义签名

typedef NSString* (^IntToStringConverter)(NSUInteger paramInteger);

这就告诉,编译器,我们定义了一个签名(别名)为IntToStringConverter 的Block Object。这个Block返回值为:NSString;参数为:NSUInteger
2.定义使用Block为参数的函数

- (NSString *)convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramBlockObject{

    

    return paramBlockObject(paramInteger);

}

这一步,很简单,我们将前面定义的Block作为了一种类型。这种类型为:IntToStringConverter
3.调用使用Block为参数的方法

 NSString *result
= [
self convertIntToString:123 usingBlockObject:intToString];

    NSLog(@"result = %@", result);

调用时,123,和intToString可理解为实参。
《二》内联Block 使用方式
在此之前,让我们梳理一下需要的代码:
1.定义

typedef NSString* (^IntToStringConverter)(NSUInteger paramInteger);

2.用Block作为参数的函数

- (NSString *)convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramBlockObject{

    

    return paramBlockObject(paramInteger);

}

3.内联调用

- (void) doTheConversion{

    IntToStringConverter inlineConverter = ^(NSUInteger paramInteger){

        NSString *result = [NSString stringWithFormat:@"%lu",
(unsignedlong)paramInteger];

        return result;

    };

    

    NSString *result = [self convertIntToString:123 usingBlockObject:inlineConverter];

    NSLog(@"result = %@", result);

    

}

调用的时候,只需要这样:

[self doTheConversion];


什么是内联Block?

我的理解是,写在方法内部的,编译器在编译阶段无法知道要调用的具体Block内容。

就像上边的例子:

独立Block:在编译阶段,已经就定义好了Block方法:

 

// 定义一个Block Object,返回值:NSString;别名:intToString;参数:NSUInteger

NSString* (^intToString)(NSUInteger) = ^(NSUInteger paramInteger){

    NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];

    return result;

};


内联Block:在编译阶段,编译器并不知道所关联的Block是什么。

因为它是在调用doTheConversion方法时,临时分配的(inlineConverter)。红色块。


 

- (void) doTheConversion{

    IntToStringConverter inlineConverter = ^(NSUInteger paramInteger){

        NSString *result = [NSString stringWithFormat:@"%lu", (unsignedlong)paramInteger];

        return result;

    };

    

    NSString *result = [self convertIntToString:123 usingBlockObject:inlineConverter];

    NSLog(@"result = %@", result);

    

}


同理,就相当于:


 

 

 

 

- (void) doTheConversion{

   

     NSString *result =[self convertIntToString:123

                               usingBlockObject:^(NSUInteger paramInteger)
{

                                   NSString *result = [NSStringstringWithFormat:@"%lu",(unsigned long)paramInteger];

                                   return result;

                               }];

    

    NSLog(@"result = %@", result);


}


是啊,很多iOS中的方法,用的都是这种方式!对用的就是内联Block!!!

原来如此啊!


先mark到这里吧!


下一步,我们来了解一下,关于Block变量的一些东西!


Block 的变量


1.独立Block 变量的操作。


定义Block:


 

void (^independentBlockObject)(void) = ^(void){

    NSInteger localInteger = 10;

    NSLog(@"local integer = %ld", (long)localInteger);

    localInteger = 20;

    NSLog(@"local integer = %ld", (long)localInteger);


};


调用:

 

independentBlockObject();


输出:

 

2013-03-26 20:13:50.144 DemoVideo[20505:707] local integer = 10

2013-03-26 20:13:50.147 DemoVideo[20505:707] local integer = 20



2.内联Block 变量的操作。


我们知道Object-C中已经有很多用Block作为参数的函数。该Block参数,作为内联Block调用。

于是,就用一个数组比较的方法:


定义:

 


- (void) simpleMethod{

    NSMutableArray *array = [[NSMutableArrayalloc]initWithObjects:@"100",@"200",@"150", nil];

    

    NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1id obj2)
{

        

        if ([obj1 integerValue] > [obj2 integerValue]) {

            return (NSComparisonResult)NSOrderedDescending;

        }

        

        if ([obj1 integerValue] < [obj2 integerValue]) {

            return (NSComparisonResult)NSOrderedAscending;

        }

        return (NSComparisonResult)NSOrderedSame;

    }];

    

}


调用:


 

[self simpleMethod];


输出:


 

Printing description of sortedArray:

<__NSArrayI 0x1f56d430>(

100,

150,

200

)

Printing description of array:

<__NSArrayM 0x1f585ed0>(

100,

200,

150

)


我们不用关心,sortedArrayUsingComparator方法的内部实现是什么,但是,它在运行中,调用了内部变量:obj1obj2


可见:独立Block可以在内部定义变量,访问变量,修改变量!

【上篇】
【下篇】

抱歉!评论已关闭.