iOS开展block说明
浅谈block使用方法
对于block他用着确实方便,好多人都非常迷茫,这里写了一个Demo解说block的使用方法
好多人都觉得block是用于后一个界面向前一个界面传值用的,事实上更详细的说是经常使用来界面之间的传值,事实上仅仅要须要传值不管是view之间还是controller之间还是view与controller之间都能够用block,当传值比較少时用block比使用代理更方便.
block创建后都在栈区存放的,block的语义特性必须用copy,通过copy能够将block从栈区放到堆区,保证每次使用block时block都存在,因此我们使用时经常要定义属性,使用属性是为了保存该block变量
例如以下举个样例解说
首先在project中创建两个类BlockViewController和BlockView
在BlockView中仅仅是为了创建几个button,在BlockViewController中使用,能够降低BlockViewController的代码任务量,可是BlockView中仅仅有一个实例变量button是,而且在延展中定义的,外部无法訪问到,当我们为button加入点击触发事件就须要获得button的tag值,这时就要把所点击button的tag获取到,来为不同的button加入响应事件
在BlockView.h中定义一个block变量和一个方法,方法的參数是block类型的
#import <UIKit/UIKit.h> //第一步:声明block
typedef void(^ButtonActionBlock)(NSInteger tag); @interface BlockView : UIView
-(void)buttonActionBlock:(ButtonActionBlock)didClickButton; @end
在BlockView.m中
<pre name="code" class="objc">#import "BlockView.h" @interface BlockView ()
//Block
//block创建后都在栈区存放的,block的语义特性必须用copy,通过copy能够将block从栈区放到堆区,保证每次使用block时block都存在
@property (nonatomic, copy) ButtonActionBlock buttonActionBlock;
@property (nonatomic, strong) UIButton *button; @end @implementation BlockView - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
CGFloat x = 5;
CGFloat y = 5;
CGFloat width = 65;
CGFloat height = 40;
//创建button
for (int i = 0; i < 4; i ++) {
self.button = [UIButton buttonWithType:(UIButtonTypeSystem)];
self.button.frame = CGRectMake(x + i * (width + 10), y, width, height);
self.button.tag = 100 + i;
self.button.backgroundColor = [UIColor cyanColor];
self.button.layer.cornerRadius = 5;
self.button.layer.masksToBounds = YES;
[self.button setTitle:[NSString stringWithFormat:@"%d",i] forState:UIControlStateNormal];
[self.button addTarget:self action:@selector(handleButton:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_button];
}
}
return self;
} //处理button的点击事件,将tag值传给block的參数回调block
-(void)handleButton:(UIButton *)button
{
NSLog(@"3");
NSInteger tag = button.tag;
//第二步,回掉block
self.buttonActionBlock(tag),NSLog(@"6");
NSLog(@"7"); } //该方法中self.buttonActionBlock = didClickButton;运行后会调用属性buttonActionBlock的setter方法,将block变量didClickButton传给setter方法的參数
-(void)buttonActionBlock:(ButtonActionBlock)didClickButton
{
NSLog(@"1");
NSLog(@"-----------didClickButton = %p",didClickButton);
self.buttonActionBlock = didClickButton; } //重写属性buttonActionBlock的setter方法,在此重写setter方法目的是为了表明该方法是把传进来的block变量进行深拷贝,复制到了堆区,并赋给了实例变量buttonActionBlock,使我们在不论什么时候都能使用block变量(block的创建后在栈区,出了方法就被回收,无法再使用)
- (void)setButtonActionBlock:(ButtonActionBlock)buttonActionBlock
{
NSLog(@"2");
if (_buttonActionBlock != buttonActionBlock) {
NSLog(@"++++++++buttonActionBlock = %p",buttonActionBlock);
_buttonActionBlock = [buttonActionBlock copy];
}
} @end
BlockViewController.m文件里导入BlockView.h文件
BlockViewController.m文件中代码实现
#import "BlockViewController.h"
#import "BlockView.h"
// 获取RGB颜色
#define RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a] @interface BlockViewController ()<UIScrollViewDelegate> @property (nonatomic, strong) UIImageView *YJFImageView; @end @implementation BlockViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) { }
return self;
} - (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = RGBA(252, 230, 201, 1.0);
BlockView *blockView = [[BlockView alloc] initWithFrame:CGRectMake(10, 0, 320 - 20, 50)];
blockView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:blockView];
//BlockView的对象blockView调用其方法buttonActionBlock:
//第三步。调用block
[blockView buttonActionBlock:^(NSInteger tag) {
//block的实现
NSLog(@"4");
[self handleButton:tag];
NSLog(@"5"); }];
[self createView];
} //处理自己定义toolBar的点击事件
-(void)handleButton:(NSInteger)tag
{ switch (tag) {
//...button
case 100:
{
self.YJFImageView.image = LOADIMAGE(@"2", @"jpg");
}
break; //...button
case 101:
{
self.YJFImageView.image = LOADIMAGE(@"5", @"jpg");
}
break; //...button
case 102:
{
self.YJFImageView.image = LOADIMAGE(@"6", @"jpg");
}
break; //...button
case 103:
{
self.YJFImageView.image = LOADIMAGE(@"4", @"jpg");
}
break; default:
break;
}
} -(void)createView
{
self.YJFImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 52, 320 - 20, 568 - 64 - 75)];
self.YJFImageView.image = LOADIMAGE(@"8", @"jpg");
self.YJFImageView.userInteractionEnabled = YES; [self.view addSubview:_YJFImageView];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
通过程序执行控制台输出结果例如以下:
点击button前:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWpmMTIzNTQ2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
由此结合代码实现中打的log能够看出
<pre name="code" class="objc">didClickButton和传入属性的setter方法的參数是一个地址,则
,BlockView.m文件里
<pre name="code" class="objc">buttonActionBlock:方法中把didClickButton拷贝了一份到栈区,赋值给实例变量_buttonActionBlock
点击button后:
结合代码实现中打的log能够看出整个Block的运行过程,也能够通过打断的查看Block的运行过程
版权声明:本文博主原创文章。博客,未经同意不得转载。
iOS开展block说明的更多相关文章
- iOS中block的用法 以及和函数用法的区别
ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候 MyBlock(); 带参数的 ...
- iOS开发--Block
iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action 一 ...
- iOS之block
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- iOS开发——Block详解
iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...
- ios开发 block语句块
ios开发 block语句块 1.block 理解为匿名函数 2.block变量的定义 //定义block变量,^表示定义block //技巧:函数名左右加括号,在函数名前面在加^ void (^bl ...
- iOS中Block介绍(一)基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- iOS中Block介绍 基础
ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...
- iOS 中Block以及Blocks的使用,闭包方法调用
OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...
- iOS中block类型大全
iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调 ...
- IOS中block和代理
从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...
随机推荐
- Java Tread多线程(2)多线程安全问题
作者 :卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39348093 本文演示,Tread多线程安全问题,以及几种解决多线程安全方式 ...
- swift开发网络篇 - 用户登录POST JSON and header
版权声明:本文为博主原创文章,未经博主允许不得转载. import UIKit import Alamofire class ViewController: UIViewController { va ...
- 可视化格式模型(visual formatting model)
原文 简书原文:https://www.jianshu.com/p/7632f16ff555 大纲 1.认识可视化模型 2.可视化模型的内容 3.可视化模型的影响因素 1.认识可视化模型 盒子模型是C ...
- [Angular2 Form] Angular 2 Template Driven Form Custom Validator
In this tutorial we are going to learn how we can also implement custom form field validation in Ang ...
- [Recompose] Set the HTML Tag of a Component via a Prop using Recompose
Learn how to user the ‘componentFromProp’ helper and ‘defaultProps’ higher order component to swap t ...
- linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定
背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[root@test vhost]# ps auxUSER ...
- thinkphp3.1的验证码
代码中写 public function verify(){ import('ORG.Util.Image'); ob_clean(); Image::buildImageVerify(); } ht ...
- 虚幻引擎中的数组---TArray: Arrays
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45367171 作者:ca ...
- 【53.90】【BZOJ 3875】 [Ahoi2014]骑士游戏
Time Limit: 30 Sec Memory Limit: 256 MB Submit: 564 Solved: 304 [Submit][Status][Discuss] Descriptio ...
- #import </usr/include/objc/objc-class.h> not such file or directory问题的解决方法
近期在使用一些开源的demo,打开后出现这个错误,然后能够把 #import </usr/include/objc/objc-class.h> 改动为以下 #import <objc ...