前言:

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代码块的更多相关文章

  1. IOS学习4——block代码块

    本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...

  2. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  3. iOS开发关于Block代码错误

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...

  4. block代码块介绍

    关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...

  5. Block代码块中使用局部变量注意点

    第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...

  6. IOS Block代码块的定义与使用

    代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值.     脱字符是代码块的语法标记.下图表示代码块的 ...

  7. iOS - OC Block 代码块

    前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...

  8. iOS - Block 代码块

    1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...

  9. hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码

    对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例 为了方便查看源代码,关联导入源代码的项目 先前的项目导入源代码是关联了源代码文件 block数据块,在配置 ...

随机推荐

  1. CDOJ 1270 Playfair

    模拟题,代码写得比较乱... #include<cstdio> #include<cstring> #include<cmath> #include<queu ...

  2. Android系统属性SystemProperties分析

    下面这几个博客总结的不错,有空看下: http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html http://blog.csdn.n ...

  3. 转载:ionic+nodejs开发遇到的跨域和post请求数据问题

    转载自:http://www.cnblogs.com/ytu2010dt/p/5471366.html 最近学习ionic+nodejs开发混合app中遇到了一些问题,在此总结一下. 项目地址 htt ...

  4. Android面试题随笔1

    1.如何让一个应用在手机上产生两个或多个图标? 在清单文件中的activity节点下配置如下:[5,7行代码] <activity android:name=".MainActivit ...

  5. iOS开发——刮奖

    还是直接上代码,有什么问题的话,直接评论. 1.在YYTScratchView.h文件中 // //  YYTScratchView.h //  Demo-刮奖 // //  Created by y ...

  6. iOS开发——Scheme白名单

    问题:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme.对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端. 报错:This app is ...

  7. LPC2478中断控制器以及串口详解

    LPC2478的中断系统 LPC2478使用的是ARM PrimeCell向量中断控制器,一共支持32个中断向量,处于AHB空间便于系统快速访问,在中断向量的硬件优先级上还有一层可以用户自己设计的软件 ...

  8. CocoaPods安装和使用教程 分类: ios技术 ios相关 2015-03-11 21:53 48人阅读 评论(0) 收藏

    目录 CocoaPods是什么? 如何下载和安装CocoaPods? 如何使用CocoaPods? 场景1:利用CocoaPods,在项目中导入AFNetworking类库 场景2:如何正确编译运行一 ...

  9. DDD之:Repository仓储模式

    在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么事Repository? "A Repository mediates b ...

  10. jmeter+ant+jenkins+mac使用HTML Publisher插件后查看html报告显示不正常

    Jenkins安全默认将以下功能关闭: 1.javascript2.html上的内置插件3.内置css或从其它站的css4.从其它站的图处5.AJAX 报告中有javascript,所以显示异常.解决 ...