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
@optional
-(void)nextViewControllerWithTitle:(NSString*)str;
@end
@interface NextViewController:UIViewController
@property(nonatomic,assign)id 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()

@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的功能的

你可能感兴趣的:(iOS block分析)