Block块.

1.声明Block

int (^myBlock)(int n) = ^(int num)

型 (^名称)(需要的参数)= ^(参数)

2 __block

在block块中修改block块外部变量的值,只有将外部的变量前面加_ _(两个短杠才能修改)

3 __weak 变量

ARC机制下,如果block用控制器象或者其量,block强引用,致拷一份控制器象从而造成内存泄露。了避免问题需要:

__weak typeof(self)weakself = self;

block可以代替代理

控件.h中声明block

@interface tapView : UIView

typedef void (^tapViewblock)(tapView * tapview);

@property (nonatomic, strong) tapViewblock  block;

@property (nonatomic, strong) UIImageView * ima;

控件.m中判断block是否存在,如果存在将控件类对象做参数

- (id)initWithFrame:(CGRect)frame

{

if (self = [super initWithFrame:frame])

{

_ima = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];

_ima.userInteractionEnabled = YES;

[self addSubview:_ima];

UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(change:)];

[tap setNumberOfTapsRequired:1];

[tap setNumberOfTouchesRequired:1];

[_ima addGestureRecognizer:tap];

}

return self;

}

- (void) change:(UITapGestureRecognizer *)sender

{

if (_block)

{

_block(self);

}

}

在控制器.m中将控制器中控件传给block,并在block实现想要的功能

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

self.view.backgroundColor =[UIColor whiteColor];

__weak typeof(self)weakself = self;

for (int i = 0; i < 3 ; i ++)

{

tapView * imageV = [[tapView alloc] initWithFrame:CGRectMake(i * 80, 50, 80, 80)];

//        imageV.delegate = self;

imageV.ima.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i + 1]];

[self.view addSubview:imageV];

imageV.block = ^(tapView * imag){

UIImageView * backimage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

backimage.image = imag.ima.image;

[self.view addSubview:backimage];

};

}

}

 

 

总结:代理其实和协议没啥两样,都是定义方法而自己不实现,但是自定义代理需要传值并且需要有调用定义方法的代码,而系统代理则直接传值且调用代理方法就可以了,无需使用自定义代码来调用代理方法;block块则为了实现控件想要达到的事件的更加简单的方法,我们使用block和自定义代理也有些类似,但是我们用block块无需定义协议,也无需调用代理,只是定义一个block块,判断block块存在时,将控件对象传给block。然后就在block块中实现控件想要实现的方法

iOS之block块的更多相关文章

  1. ios开发 block语句块

    ios开发 block语句块 1.block 理解为匿名函数 2.block变量的定义 //定义block变量,^表示定义block //技巧:函数名左右加括号,在函数名前面在加^ void (^bl ...

  2. iOS开发之使用block块进行数据遍历的方法

    看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...

  3. iOS开发--Block

    iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action   一 ...

  4. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  5. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...

  6. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  7. IOS开发 Block的学习

    苹果公司正在大力推广Block块语法的使用,据说Block会迟早取代一般协议代理的使用. Block最大的作用是函数回调,简化代码. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代 ...

  8. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  9. iOS之block

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

随机推荐

  1. Array types are now written with the brackets around the element type

    因为网站翻译的时候应该用的beta/beta2,而再beta4中就会出现问题,解决问题方案: var shopping: String[] = ["Eggs","Milk ...

  2. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...

  3. HDU3657Game(最大流)

    这几天敲了几道最大流的问题,发现网络流真是模板算法啊.... 敲来敲去敲了几遍,基本每遍都敲得让人灰心,但同时也感受到了网络流的强大所在,这是我做网络流的第一题,,本以为看了一遍小白书的代码差不多理解 ...

  4. Animation Spinner【项目】

    https://github.com/vjpr/healthkick/blob/master/src/win/healthkick/ucSpinnerCogs.xaml 网上的例子,放在UserCon ...

  5. c语言-格式控制字符 %XXd 用法

    d格式字符 用来输出十进制整数,有以下几种用法: 1. %d, 按整型数据的实际长度输出. 2.  %md,m为指定输出的整型位数的宽度,如果整型数据的实际位数小于m,则左端补以空格,如果大于m,则按 ...

  6. 移动端轮播图插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持图片自动轮播和非自动轮播 2. 支持点击和滑动. 三. 简单介绍 代码都有注释,逻辑简单,不做更多赘述. 1. 在你的html中添加一行. <sectio ...

  7. Mac OS X取消Apache(httpd)开机启动

    安装MAMP后,启动服务时提示Apache启动失败,80端口被占用.查看进程发现存在几个httpd. OS X自带Apache,可是默认是没有启动的.我也没有开启Web共享,怎么就开机启动了呢? 不知 ...

  8. 利用Retrofit, RxJava获取网络内容

    Retrofit & RxJava 关于如何使用Retrofit和RxJava请阅读参考中的两篇文章. Retrofit处理数据 Retrofit是在什么时候处理从网络中获取到的json数据的 ...

  9. How To: Perl TCP / UDP Socket Programming using IO::Socket::INET

    http://www.thegeekstuff.com/2010/07/perl-tcp-udp-socket-programming/ In this article, let us discuss ...

  10. hdu1232 畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...