iOS block分析
学习block从迷惑到渐渐的清晰,在这里跟大家分享一下
block的创建
block可以在函数内定义也可以在函数外定义
1.在文件范围内定义:
typedef void(^block名字)(block的参数,可以多个)
2.在函数内定义:
void(^myBlock)(NSString* str) = ^(NSString* str){ NSL(@"%@",str); };
block相当于一个匿名的函数,没有调用的话不会执行
__block的使用:
在block中引用外部变量的时候,其实是在没有运行时就捕捉到外部变量的值,当block内试图改变外部变量的值的时候,这时候编译器就提示x变量错误信息:Variable is not assigning (missing __block type);这时候在变量的声明是加__block就可以避免这种情况,如:__block NSString* name = @"张三";
通常block是用来跨越两个类来使用的,比如作为属性或者参数的话就可以跨越两个类使用了
比如在两个类之间相互传值:
假设需求:在一个rootViewController中点击跳转到另一个页面,在另一个页面NextViewController中的textFelix中填写后点击返回,将值传给rootViewController中的navigationItem.title
1.使用代理/协议实现
//在NextViewController.h中
//添加NextViewController的协议
@protocol NextViewControllerDelegate<NSObject>
@optional
-(void)nextViewControllerWithTitle:(NSString*)str;
@end
@interface NextViewController:UIViewController
@property(nonatomic,assign)id<NextViewControllerDelegate> delegate;
@end
//在NextViewController.m文件中
//在点击返回的按钮激发的方法中
-(void)pop{
if(self.delegate && [self.delegate respondsToSelector:@selector(nextViewControllerWithTitle:)]){
[self.delegate nextViewControllerWithTitle:self.textField.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
在rootViewController中:
//导入NextViewController.h头文件
import “NextViewController.h”
//继承NextViewControllerDelegate协议
@interface rootViewController()<NextViewControllerDelegate>
@end
//在点击跳转的方法中
-(void)push{
NextViewController* nextVC = [[NextViewController alloc]init];
nextVC.delegate = self;
[self.navigationController pushViewController:nextVC animated:YES];
}
-(void)nextViewControllerWithTitle:(NSString*)str{
self.navigationItem.title = str;
}
2.使用block进行传值:
//在NextViewController.h中
@interface : UIViewController
@property(nonatomic,copy)void(^nextViewControllerBlock)(NSString* str);
@end
//NextViewController.m
//在返回函数中
-(void)pop{
if(self.nextViewControllerBlock){
self.nextViewControllrBlock(self.textField.text);
}
[self.navigationController popViewControllerAnimated:YES];
}
//rootViewController.m
//跳转函数中
-(void)push{
NextViewController* nextVC = [[NExtViewController alloc]init];
nextVC.nextViewControllerBlock = ^(NSString* str){
self.navigationItem.title = str;
};
}
使用block来传值比delegate要简洁的多,实际上,block就是用来代替Delegate的功能的