创建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);
}