Block的使用--初探Block
看了两天的Block。
网上是有非常多解说与教程,也有讲得非常好的。这里就主要解说下我的理解与收获。欢迎拍砖。
所谓block。我觉得应该是一个闭包函数。而闭包,就是说block以及内部全部的变量生命周期都在其调用函数的生命周期内。
它一被调用完毕,则会被立刻释放。这里不讲运行机制,仅仅简要地讲基本的用法(这里所讲是基于ARC的环境下)。
定义以及使用
1、放在函数体内的Block:生命周期:仅仅存在于函数体。与函数体内的局部变量相似。
其定义方式跟函数还是非常相似的。为了简便理解我们对照下block与函数的定义。先看一下最简单的形式,无返回值带參。先看Block直接放在函数体内的形式:
函数:
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
Block直接放在函数体内的形式:
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
这里能够看到。我们的函数体一般形式是:
- (返回值) 函数名: (形參)...
调用形式是:[调用对象 函数名(形參)];
那我们放在函数体内的Block定义则是:
返回值 (^ Block名)( 形參 ) = ^( 形參 ){ //实现内容 };
调用形式是 :Block名(形參)。
这里的Block就相当于是一个内嵌函数。
声明与实现要同一时候放在一起。形式就非常像我们寻常使用的对象赋值一样:id obj = ... ;
2、放在函数外的Block。
即为类内部范围内的全局Block。生命周期为整个类内部。
定义与用法都与上面一致,仅仅只是就像局部变量与类变量一样是否可被其它方法调用而已。为了更简单明了我们能够看一下这个代码:
//普通方法定义
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
//函数体外的Block
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
//Block调用
- (void)printSomething {
printBlock(@"I'm printBlock");
}
3、放在类定义头文件的Block。
可被实例对象拥有。生命周期为整个实例对象。
头文件里的定义(1):
typedef void(^printBlockClass)(NSString *);
@interface BlockClass : NSObject
@property (nonatomic, copy)printBlockClass print;
@end
//或者在实现文件里:
//但这样的实如今内部的Block我也不知道有什么卵用。实际应用不大。
@interface BlockClass : NSObject
{
printBlockClass print;
}
@end
头文件里的定义(2):
//与方式一的差别无非像是自己定义一种结构然后你再去使用一样
@interface BlockClass : NSObject
@property (nonatomic, copy) void(^printBlockClass)(NSSting *output);
@end
这样的把Block作为属性的情况是比較多用于页面传值中。
关于Block的使用另一下几个注意点:
1、仅仅有在调用Block的时候才会运行{}内部的代码(就比方把Block定义在函数体内不调用是不会运行的)。
2、在Block的{}内部代码中是对外部的变量能够引用,但不能改变。假设试图更改会产生一个编译器错误。除非你把想要更改的变量声明时加上 __block关键字。
3、在block使用过程要注意不要产生循环引用。
关于循环引用(Memory Recycle)这里有一篇文章写得不错。有兴趣能够看看:http://blog.csdn.net/fengsh998/article/details/38090205
Block的使用--初探Block的更多相关文章
- 写给喜欢用Block的朋友(ios Block)
作者:fengsh998原文地址:http://blog.csdn.net/fengsh998/article/details/38090205转载请注明出处如果觉得文章对你有所帮助,请通过留言或关注 ...
- block的用法以及block和delegate的比较(转发)
看到一篇写的关于block和delegate放在一起来方便大家理解的文章,感觉不错,就推荐给大家来看一下. 代理设计模式对于iOS开发的人来说肯定很熟悉了,代理delegate就是委托另一个对象来帮忙 ...
- Objective-C中Block语法、Block使用以及通过Block实现数组排序
Block:语法块,本质上是匿名函数(没有名称的函数) 标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数 在C++.JS.Swift等语言有类似语法,叫做闭包 Block语法和C语言里的 ...
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- Block高级用法:Block传值UI_12(3)
1.简单复习Block的定义.赋值.调用做学习传值铺垫: //声明一个函数 无返无参void printfHello(int a);//函数的实现void printfHello(int a){ ...
- 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)
1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...
- ORA-01578 ORACLE data block corrupted (file # 29, block # 2889087)
BW数据库后台报错如下:F:\oracle\SBP\saptrace\diag\rdbms\sbp\sbp\trace ORA-01578: ORACLE data block corrupted ( ...
- block(九)Block 和 Delegate 的使用比较
Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段 Block(代码块) 优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的实现地方在同 ...
- Block系列2:Block内存管理
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController { UIImag ...
- 转:InnoDB Log Block Structure(InnoDB日志Block结构详解)
文章转载自等博 InnoDB Log Block Structure(InnoDB日志Block结构详解)
随机推荐
- [Hyperapp] Interact with the State Object through Hyperapp Action functions
Hyperapp is an ultra lightweight (1kb), minimal, functional, JavaScript library for building UIs. It ...
- android的架构图
1.Applications 该层是Android应用程序层. 每一个应用必须利用android系统设计的应用框架(application framework)开发. 眼下的开发环境是eclipse ...
- Mysql 数据迁移后 启动出错
今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...
- LeetCode -- 求字符串数组中的最长公共前缀
题目描写叙述: Write a function to find the longest common prefix string amongst an array of strings.就是给定1个 ...
- Android圆形图片--自己定义控件
Android圆形图片控件效果图例如以下: 代码例如以下: RoundImageView.java package com.dxd.roundimageview; import android.con ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)
2663: [Beijing wc2012]灵魂宝石 题目:传送门 题解: 又是一道卡精度的题目. 很容易就可以看出单调性啊,如果R越大,选的人就越多,R越小,选的人就越少. 那最小值就直接搞咯. 那 ...
- python中各项目文件含义(新手可看)
其他不用多说,这里主要阐述三个概念,包.模块.类 包我们可以看作一个包含__init__.py 和一系列.py 文件的文件夹,包含__init__.py这样做的目的是为了区别包和普通字符串,读者可以试 ...
- 132.try throw catch介绍
#include <iostream> using namespace std; //try尝试执行,抛出throw,throw之后语句不再执行 //catch处理throw的异常 voi ...
- yum 命令讲解
(一)yum介绍 Yum(全称为 Yellow dogUpdater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定 ...