本人iOS新手一枚,刚自行学习了下的block,哪里不对的地方,请指出
例举1:block的简单使用
void无返回值,^(myFirstBlock)命名,()无类型
void (^myFirstBlock)() = ^{
NSLog(@"this is a block");//这里写需要实现哪些功能
};
例举2:block的简单使用
int返回值类型,int a,int b 传参的类型,这里返回为a+b的int类型
int (^addBlock)(int a,int b) = ^(int a,int b){
return a + b;
};
然后在想用的地方调用一下,传递a和b参数
int add = addBlock(2,3);
NSLog(@"add=%d",add);
ps:输出结果add=5
例举3:block的简单使用
block内部需要修改数值
NSArray *arr = @[@"dog",@"cat",@"cow",@"pig"];
__block BOOL isExist = NO;//这里需要在前面加上 __block
//枚举arr数组查询
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj compare:@"cow"] == NSOrderedSame){ //NSOrderedSame 表示前者和后者完全一样
isExist = YES;
}
}];
if (isExist) {
NSLog(@"存在");
}else{
NSLog(@"不存在");
}
例举4:block用于反向传值
两个控制器 控制器1 和 present出来的第二个控制器2
控制器2代码 .h 里面
typedef void(^myBlock) (NSString *msg);//定义一个block,myBlock,用于传递 NSString类型 的信息
#import <UIKit/UIKit.h>
@interface nextViewController : UIViewController
@property (nonatomic,copy)myBlock msgBlock;//重命名了block
@end
控制器2代码 .m 里面,在返回上一个页面(控制器1)的按钮里传递参数
- (IBAction)backBtnClick:(UIButton *)sender {
ViewController *VC = [[ViewController alloc] init];//实例化上一个页面
if (self.msgBlock) {
self.msgBlock(@"我来自第二个页面"); //传递参数
}
[self dismissViewControllerAnimated:VC completion:^{}];
}
然后,控制器1 .m代码
在弹出第二个页面(控制器2)的方法里面调用block(这里就是控制器2传递回来的参数)
- (IBAction)nextBtnClick:(UIButton *)sender {
nextViewController *nextVC = [[nextViewController alloc] init];
nextVC.msgBlock = ^(NSString *msg){
NSLog(@"这里要得到第二个页面的文字-------%@",msg);
};
[self presentViewController:nextVC animated:YES completion:^{}];
}
ps:打印结果:这里要得到第二个页面的文字-------我来自第二个页面
反向传值还是很普及的,这都是很简单的用法,block里面不要强引用,记得用__weak修饰,先写到这里,后期再添加block相关的新内容