IOS学习之block代码块
前言:
block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然有点找回当年即将毕业时的最后一个春节假期的感觉,今天基于最近使用的角度来学习总结一下block。
什么是Block?
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是
inline
的,并且它对局部变量是只读的,^是block语法的标识。
声明block
第一种方式:用typedef定义一个block类型
typedef void (^Sucess)(NSString*);//用typedef定义一个block类型 @property (nonatomic,copy) Sucess myBlock;
第二种方式:也可以通过标准的block函数体
@property (nonatomic,copy) void(^myBlock)(NSString*);
完整的block: NSString* (^callBack) (NSString *)
第一个参数:block返回值
第二个参数:block名字
第三个参数:block回调参数
NSString* (^callBack) (NSString *) =^(NSString *string){
NSMutableString * tempString=[[NSMutableString alloc]initWithString:@"I wanna to know "];
return [tempString stringByAppendingString:string];
} ;
NSString *result=callBack(@"who is lcj ?"); NSLog(@"result ----> %@",result);
block访问变量
int num=; int (^plus) (int ,int )=^(int a,int b)
{
num=a+b; return num;
}; int finalNum=plus(,);
NSLog(@"finalNum--->%d",finalNum);
比如上面这种方式是编译不通过的,block可以访问局部变量,但是不能修改。如果要修改就要加关键字:__block,修改后如下
__block int num=; int (^plus) (int ,int )=^(int a,int b)
{
num=a+b; return num;
}; int finalNum=plus(,);
NSLog(@"finalNum--->%d",finalNum);
block循环引用
循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。举例说明:
在block中处理viewController的全局变量str
void(^dealString)(void)=^{ self.str=@"who is lcj ?";
}; dealString();
如何解决?使用weakSelf,换言之类似Android中的弱引用
__weak typeof (self) weakSelf = self;
上面的修改成下面这种方式就可以解决循环引用问题
__weak typeof (self) weakSelf = self;
void(^dealString)(void)=^{ weakSelf.str=@"who is lcj ?";
}; dealString();
总结:
今天大致总结了最近在开发中使用block的几个心得体会,后续更多block的高级使用再做总结。
IOS学习之block代码块的更多相关文章
- IOS学习4——block代码块
本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...
- block(代码块)的介绍以及使用方法和变量之间的关系
http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...
- iOS开发关于Block代码错误
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...
- block代码块介绍
关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...
- Block代码块中使用局部变量注意点
第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...
- IOS Block代码块的定义与使用
代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值. 脱字符是代码块的语法标记.下图表示代码块的 ...
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
- iOS - Block 代码块
1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...
- hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码
对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例 为了方便查看源代码,关联导入源代码的项目 先前的项目导入源代码是关联了源代码文件 block数据块,在配置 ...
随机推荐
- xmlns=""
用dom4j把两个手上的element撮合到一起,dom4j就会在被加的元素上写上xmlns="",当时我也没在意,后来用户要求去掉,查了一下还不是那么容易,原来xml本身对nam ...
- C# 开发系列(一)
1.开发环境搭建: win7 32位系统,然后安装 visual studio 2012. 2.将 .net_framework 加入到windows 的环境变量当中. C:\Windows\Micr ...
- 三种Dataase Mapping的系统架构
ORM - O/R M - Object/Relational Mapping: A technique/idea used to map objects and thier individual r ...
- AOJ2249最短路+最小费用
题意:求出某个点到其他点的最短路,并求出在最短路情况下的最小费用 分析:用dijkstra求出最短路并同时更新最小费用即可,注意的是在最短路长度相同时费用取最小即可 #include <iost ...
- Tomcat与Nginx、Apache结合的相关实践
一.LNMT 简介:在Tomcat服务器前端部署一个Nginx(反向代理),当用户请求静态资源时,由Nginx服务器负责响应:当用户请求java应用程序资源时,由后端的Tomcat服务器进行响应. 环 ...
- Ubuntu上搭建Git服务器
下面我们就看看,如何在Ubuntu上搭建Git服务器.我们使用VMware虚拟机安装两台Ubantu系统,分别命名为gitServer和gitClient_01. 1.安装OpenSSH并配置SSH无 ...
- 关于Inflater
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- oracle关键字(保留字)
其实这个东西可以在oracle 上输入一个sql语句就可以得到: select * from v$reserved_words order by keyword asc; //order 后边不是 ...
- WPF中ContextMenu通过CommandParameter传参
场景:ListBox中有个ContextMenu,希望点击其中一个菜单项的时候把ListBox当做CommandParameter传递给Command,但是发现无论是通过ElementName还是Re ...
- Spring Boot Web Executable Demo
Spring Boot Web Executable Demo */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.sr ...