并发(一):Block Objects


创建Block对象

1.Obj-C 、C和Block的联系

1.
-(NSInteger)subtract:(NSInteger)paramValue
                from:(NSInteger)paramFrom{
    return paraFrom - paramValue;
}
2.
NSInteger subtract(NSInteger paramValue,NSInteger paramFrom){
    return paraFrom - paramValue;
}
3.
NSInteger (^subtract)(NSInteger,NSInteger)=^(NSInteger paramValue,NSInteger paramFrom){
    return paraFrom - paramValue;
}

2.最简单的Block函数

不带参数,也没有返回值

void (^simpleBlock)(void)=^{
    /*Implement the block object here*/
}

3.独立的Block函数

NSString *(^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
    NSString *result = [NSString stringWithFormat:@%"lu",(unsigned long)paramInteger];
    return result;
}

4.Block函数的调用方式

像C语言那样请求

-(void)callIntToString{
    NSString *string = intToString(10);
    NSLog(@"string = %@",string);
}

5.将Block对象作为函数参数

(1).independent block objects(独立Block)

定义

NSString *(^intToString)(NSUInteger) = ^(NSUInteger paramInteger){
    NSString *result = [NSString stringWithFormat:@%"lu",(unsigned long)paramInteger];
    return result;
}

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

-(NSString *)convertIntToString:(NSUInteger)paramInteger usingBlockObject:(IntToStringConverter)paramInteger;
    return paramInteger(paramInteger);
}

调用

-(void)doTheConversion{
    NSString *result = [self convertIntToString:123 usingBlockObject:intToString];
    NSLog(@"result = %@",result);
}

(2).inline block objects(内联Block)

先化简

-(void)doTheConversion{
    IntToStringConverter inlineConverter = ^(NSUInteger paramInteger){
        NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
        return result;
    }
    NSString *result = [self converIntToString:123 usingBlockObject:inlineConverter];
    NSLog(@"result = %@",result);
}

然后写成这样

-(void)doTheConversion{
    NSString *result = [self converIntToString:123 usingBlockObject:^NSString *(NSUInteger paramInteger){
        NSString *result = [NSString stringWithFormat:@"%lu",(unsigned long)paramInteger];
            return result;
    }];
    NSLog(@"result = %@",result);
}

使用Block对象中的变量

使用要点
1. block对象里的局部变量与Obj-C方法中的用法相同;
2. 对于内联block对象来说,局部变量不仅可以在block内部定义,也可以在实现block的方法中定义;
3. 如果你的Obj-C方法中有一个独立的block对象,你就不应该在这个block对象中引用self这个类本身。如果你需要使用self,你需要将self作为参数传递给这个block;
4. You can refer to self in an inline block object only if self is present in the lexical scope inside which the block object is created {4. 当且仅当self存在这个block被创建的语法范围内,你可以在内 联block对象中引用self}
5. 对于内联block对象,在block对象实现内部定义的局部变量可读可写;
6. 对于内联block对象,Obj-C方法中定义实现的局部变量只可读,不可写。有一个情况除外,就是在block之前,对Obj-C方法中的局部变量前面添加__block字段,这样一来,那个变量在block中也成了又可读又可写了;
7. 假如你有一个NSObject的对象,而且在这个对象的实现文件中,你使用了一个联合使用了GCD的blcok对象。那么在这个block对象中,你将会拥有对该NSObject对象声明过的属性的读写权限;
8. 如果你想在你的独立block中使用你的NSObject对象的属性,你必须调用它们的setter和getter方法。你不能在独立block中通过点语法来调用对象的属性;


请求Block对象

嵌套调用block对象:

///>  第一个block
NSString *(^timeString)(NSString *) = ^(NSString *inputString){
    NSString *result = [inputString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    return result;
};
///>  第二个block
NSString *(^trimWithOtherBlock)(NSString *) = ^(NSString *inputString){
    return timeString(inputString);
};

-(void)callTrimBlock{
    NSString *trimmedSting = trimWithOtherBlock(@"  hehehehe   ");
    NSLog(@"Trimmed string = %@",trimmedSting);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值