初始block,关于定义的几个小题目

时间:2023-03-09 17:12:46
初始block,关于定义的几个小题目

block的定义和C语言指针函数非常相似,就可以照着指针函数的方法去依葫芦画瓢就可以了

block中的^只是用来表示这是一个block对象,和函数指针中的*作用一样,只是一个标识符

下面有三个小例子来帮助理解:

1,写一个返回值为整型,参数为NSString(仅一个参数)的block,实现将字符串转换为整型的功能。

int (^change)(NSString *) = ^int (NSString *str) {
return [str intValue];
}; NSString *str = @"";
NSLog(@"%d", change(str)); // 可以用typedef给方法重命名,没有其他意义,这还是同一种方法
typedef int (^CHANGE)(NSString *);
CHANGE change = ^int (NSString *str) {
return [str intValue];
}; NSString *str = @"";
NSLog(@"%d", change(str));

2.定义一个block, 返回值是NSString对象,参数是NSArray对象,实现从数组中取出第三个元素的功能

 NSString *(^gain)(NSArray *) = ^NSString *(NSArray *array) {
return [array objectAtIndex:];
}; NSArray *array = @[@"yinhao", @"yinxiao", @"yinshuanghao", @"yindongdong"];
NSString *str = gain(array);
NSLog(@"%@", str); // 和刚才一样,用typedef只是为了装那啥,没有其他意义,这还是同一种方法
typedef NSString *(^GAIN)(NSArray *);
GAIN gain = ^NSString *(NSArray *array) {
return [array objectAtIndex:];
}; NSArray *array = @[@"yinhao", @"yinxiao", @"yinshuanghao", @"yindongdong"];
NSString *str = gain(array);
NSLog(@"%@", str);

3.

int a = 10;

void (^myBlock)() =

^{

NSLog(@"a = %d",a);

};

myBlock();

第一问:在block块内部能否访问到外部变量

第二问:在block块内部能否改变外部变量的值

第三问:block内部访问a和外部变量a的地址是否一样

第四问:如果我想在block内部改变外部的值该怎么办?

 // 第一问:当然可以,当我们运行之后发现,控制台有输出结果,就说明能访问外部的变量

 // 第二问:不可以
int a = ; // 局部变量,存放在栈区 void (^myBlock)() =
^{
a = ; // 以const的方式进行值拷贝
};
myBlock(); //第三问: 不一样 外部a存放在栈区,内部a存放在堆区
int a = ;
NSLog(@"外部a = %p", &a);
void (^myBlock)() =
^{
NSLog(@"内部a = %p", &a);// 堆区地址后六位有值
};
myBlock(); // 第四问:方法一:把外部变量定义成全局变量,方法二:在局部变量前加__block;我推荐第二种方法
__block int a = ; // 局部变量,存放在栈区 void (^myBlock)() =
^{
NSLog(@"a = %d",a); // 以const的方式进行值拷贝,不可以改变,存放在堆区
};
myBlock();