OC学习 第十四章 Block代码块
一、声明实现方式:
1.
int
(^myfun)(
int
a);
myfun = ^( int a){
return a;
};
int b = myfun( 10 );
myfun = ^( int a){
return a;
};
int b = myfun( 10 );
NSLog(@"%d",b);
2.
int
(^myfun2)(
int
a,
int
b) = ^(
int
a,
int
b){
return a+b;
};
int c = myfun2( 1 , 2 );
return a+b;
};
int c = myfun2( 1 , 2 );
NSLog(@"%d",c);
3.
NSString
*(^myfun3)(
NSString
*s) = ^(
NSString
*s){
return s;
};
return s;
};
NSLog(@"%@",myfun3(@"123"));
二、值的改变:(调用时“()”不能少,即使无参数传递也不行)
1.局部变量(需加
__block
)
__block int b = 0;
void (^myBlock2)() = ^(){
b++;
};
2.全局变量(不需加
__block
):
int c = 0;
void (^myBlock3)() = ^(){
c++;
};
3.block
作为函数的参数
函数返回值类型
函数名
(block
的声明格式
)
void
fun(
int
(^bsasa)(
int
a,
int
b)){
int sum = bsasa( 3 , 2 );
NSLog ( @"%d" ,sum);
}
void fun1( NSString *(^myBlock)( NSString *s), NSString *s1){
NSLog ( @"---%@" ,myBlock(s1));
}
int main( int argc, const char * argv[]) {
@autoreleasepool {
// 当一个 block 作为函数的参数是,其返回值类型、形参个数及类型要与函数形参格式保持一致
int (^myBlock) ( int c, int d) = ^( int a, int b){
NSLog ( @"--%d,%d" ,a,b);
return a-b;
};
// 函数形参是 block ,调用时,直接传 block 的名字就行
fun (myBlock);
// 调用的另一种方式:内联
// 内联 block 格式: ^ 返回值类型 ( 形参列表 ){}
fun (^ int ( int a, int b) {
return a*b;
});
fun1 (^ NSString *( NSString *s) {
return s;
}, @"123" );
}
return 0 ;
int sum = bsasa( 3 , 2 );
NSLog ( @"%d" ,sum);
}
void fun1( NSString *(^myBlock)( NSString *s), NSString *s1){
NSLog ( @"---%@" ,myBlock(s1));
}
int main( int argc, const char * argv[]) {
@autoreleasepool {
// 当一个 block 作为函数的参数是,其返回值类型、形参个数及类型要与函数形参格式保持一致
int (^myBlock) ( int c, int d) = ^( int a, int b){
NSLog ( @"--%d,%d" ,a,b);
return a-b;
};
// 函数形参是 block ,调用时,直接传 block 的名字就行
fun (myBlock);
// 调用的另一种方式:内联
// 内联 block 格式: ^ 返回值类型 ( 形参列表 ){}
fun (^ int ( int a, int b) {
return a*b;
});
fun1 (^ NSString *( NSString *s) {
return s;
}, @"123" );
}
return 0 ;
}
4.block作为方法的参数(注意代码走向)
声明:1.-(
void
)four:(
void
(^)(
int
a,
int
b))block;
2.
-(
void
)sengStr:(
NSString
*)name andblock:(
NSString
*(^)(
NSString
*))myblock1
实现:1.
Arithmetic
*ari = [[
Arithmetic
alloc
]
init
];
[ari four :^( int a, int b) {
NSLog ( @" 和为 %d" ,a + b);
[ari four :^( int a, int b) {
NSLog ( @" 和为 %d" ,a + b);
}];
2.
-(
void
)sengStr:(
NSString
*)name andblock:(
NSString
*(^)(
NSString
*))myblock1{
myblock1(name);
myblock1(name);
}
(对应2.)主函数:
[p
sengStr
:
@"
尚德
"
andblock
:^
NSString
*(
NSString
*s) {
NSLog ( @" 我在: %@" ,s);
return s;
NSLog ( @" 我在: %@" ,s);
return s;
}];(理解)
block
作为方法的参数:(返回值类型
(^)(
形参列表
)
)参数名
(blcok
名字
)
使用typedef
声明block
:typedef
返回值类型 (^
名字)(
形参列表)