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 ...
随机推荐
- LA 2191 - Potentiometers
看题传送门 Fenwick树的应用~~~ #include <cstdio> #include <cstring> #include<algorithm> usin ...
- IOS基础:深入理解Objective-c中@class 和#import的区别
在面向对象objective-C语言中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,可以#import方式引入,通过@class引入: 这两种的方式的区别在于: 1.运用#im ...
- [Angular 2] BYPASSING PROVIDERS IN ANGULAR 2
Artical --> BYPASSING PROVIDERS IN ANGULAR 2 Here trying to solve one problem: On the left hand s ...
- XML Parser Errors See Details for more Information XML Parser Error on line 1: Document root ele
1.错误描写叙述 XML Parser Errors See Details for more Information XML Parser Error on line 1: Document roo ...
- HDU 1280 前m大的数 基数排序
http://acm.hdu.edu.cn/showproblem.php?pid=1280 题目大意: 给你N(N<=3000)个数(这些数不超过5000),要求输出他们两两相加后和最大的M( ...
- php中模拟多继承如何实现
php中模拟多继承如何实现 一.总结 一句话总结:其实你继承别人也是想调用别人类里面的方法和属性,所以可以这样做:这本类中创建目标类的对象,然后通过这个对象来调用方法和属性,这样比继承来的方便. 二. ...
- angular自定义指令相关知识及代码
原文地址 https://www.jianshu.com/p/0c015862156d 大纲 1.自定义指令之——属性指令 2.自定义属性指令的运行原理 3.自定义属性指令代码实践 4.自定义结构指令 ...
- Java中的${pageContext.request.contextPath}
之前在drp项目中就接触了${pageContext.request.contextPath}.当时没有注意.这次在java版高校云平台ITOO4.0中再次与之相遇,真是无巧不成书啊.再次遇到.我再置 ...
- jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法)
jquery简单使用(看教程:快全有实例)(固定样式:$().val()设置属性,$().click()设置方法) 一.总结 1.jquery不懂之处直接看教程,案例都有,有简单又快 2.jquery ...
- 小强的HTML5移动开发之路(49)——HTML5开发神器HBuilder
今天给大家介绍一款开发HTML5的神器--HBuilder. 下载地址:http://www.dcloud.net.cn/ 一.新建文件 可以看到支持web app开发和普通网站前端开发,我们首先建立 ...