Objective-C之Block
Block基本概念
本小节知识点:
- 【了解】什么是Block
- 【理解】block的格式
1.什么是Block
Block是iOS中一种比较特殊的数据类型
Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛
- 动画
- 多线程
- 集合遍历
- 网络请求回调
Block的作用
- 用来保存某一段代码, 可以在恰当的时间再取出来调用
- 功能类似于函数和方法
2.block的格式
- Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};

- block最简单形式
void (^block名)() = ^{代码块;}
例如:
void (^myBlock)() = ^{ NSLog(@"李南江"); };
- block带有参数的block的定义和赋值
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
- 带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
- 调用Block保存的代码
block变量名(实参);
block和typedef的使用
C语言的指向函数指针用法
#import <Foundation/Foundation.h>
int sum(int value1,int value2)
{
return value1 + value2;
}
int minus(int value1,int value2)
{
return value1 - value2;
}
int main(int argc,onst char * argv[])
{
int (*sumP)(int,int);
sumP = sum;
NSLog(@"sum = %i",sumP(20,10));
int (*minusP)(int,int)
minusP = minus;
NSLog(@"minus = %i",minusP(20,10));
return 0;
}
由于相同的部分可以抽离出来,所以需要使用typedef
#import <Foundation/Foundation.h>
int sum(int value1,int value2)
{
return value1 + value2;
}
int minus(int value1,int value2)
{
return value1 - value2;
}
typedef int (*calculte)(int,int)
int main(int argc,onst char * argv[])
{
calculte sumP = sum;
NSLog(@"sum = %i",sumP(20,10));
calculte minusP = minus;
NSLog(@"minus = %i",minusP(20,10));
return 0;
}
OC的block的用法
#import <Foundation/Foundation.h>
int main(int argc,onst char * argv[])
{
int (^sumBlock)(int,int);
sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10));
int (^minBlock)(int,int);
minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10));
return 0;
}
使用typedef之后:
#import <Foundation/Foundation.h>
typedef int (^calculteBlock)(int,int);
int main(int argc,onst char * argv[])
{
calculteBlock sumBlock = ^(int value1,int value2){
return value1 + value2;
};
NSLog(@"sum = %i",sumBlock(20,10));
calculteBlock minBlock = ^(int value1,int value2){
return value1 - value2;
};
NSLog(@"min = %i",minBlock(20,10));
return 0;
}
block的应用场景
在学习UI之后就会体会到block的好处。
这段代码要多练习,练习到不用看源码就能熟练敲出来。
#import <Foundation/Foundation.h>
void Hello(void (^func)())
{
NSLog(@"Hello Wrold~");
func();
NSLog(@"Hello HeYang~");
}
void sayHello()
{
Hello(^{
NSLog(@"Hello World,Hello HeYang~");
});
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
sayHello();
}
return 0;
}
举个block应用实例场景:
需求:
找到需要读取并需要操作的文件
步骤:
读取文件
操作文件
关闭文件
分析:
其中读取文件和关闭文件都是一样的
而操作文件,会根据需求而变化,或者根据文件类型而不一样
总结:
这里就需要使用block把操作文件的功能分离出来。
将Objc的m文件编译成C++文件的终端命令:
cc -rewrote-objc xx.m(OC的m文件)
然后在当前目录下就会出现后缀cpp的C++文件。
block是存储在堆中还是在栈中?
默认情况下block存储在栈中,如果对block进行一个copy操作,block会转移到堆中
如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作
但如果是block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain
在MRC模式下,我们分析一下是不是会出现内存泄露
Person *p = [[Person alloc]init];
NSLog(@"retainCount = %lu",[p retainCount]);
void (^myBlock)() = ^{
NSLog(@"a = %@",p);
NSLog(@"block retainCount = %lu",[p retain]);
}
Block_copy(myBlock);
myBlock();
如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。
加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。
Objective-C之Block的更多相关文章
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- iOS Block中的weakSelf/strongSelf
Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle) ...
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...
- 唐巧的iOS技术博客选摘
1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cr ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective C block背后的黑魔法
前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...
- Objective-C( block的使用)
block block用来保存一段代码 block的标志:^ block跟函数很像:可以保存代码.有返回值.有形参.调用方式跟调用方法一样 block内部可以访问外面的变量 默认情况下,block内部 ...
- 初学Objective - C语法之代码块(block)
一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...
- Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法
NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...
随机推荐
- 【干货分享】Google 的设计准则,素材和资源
在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...
- .NET框架面向对象分层的个人想理
简单.层次清晰不要过度优化,接口这玩意儿就是个双刃剑,玩好了解藕,玩不好自找麻烦,好的代码永远都是傻瓜都能看懂的. 总结成以下几条: 公用层 代码公用并且与第三方DLL和业务逻辑无关的 独立出来 逻辑 ...
- 《构建之法》第8、9、10章读书笔记、读后感以及Sprint1总结
第八章:需求分析 软件需求 人们(用户)的需求五花八门,作为一个软件团队要准确而全面地获取这些需求主要有以下四个步骤: 获取和引导需求.这一步骤也被叫做“需求捕捉”.软件团队需要为用户着想,设身处地, ...
- 实现java 中 list集合中有几十万条数据,每100条为一组取出
解决"java 中 list集合中有几十万条数据,每100条为一组取出来如何实现,求代码!!!"的问题. 具体解决方案如下: /** * 实现java 中 list集合中有几十万条 ...
- CheckListBox的实现方式分析
实际项目中常常要实现有CheckBox列表框.但是WPF没有自带这样的一个控件,下面就用Style来实现这样的功能.而对于CheckBox列表框,又常常会有一个Select All的CheckBox来 ...
- MongoDB安装说明以及MongoVUE使用
简单介绍mongoDb MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产 ...
- 根据Expander的IsExpanded属性值的变化动态设计Control的size
简要说明: 当Expander 的IsExpanded属性为“True” 时给控件设个尺寸(此处为高度),当为“False”时给控件设另外一个值. 知识点:数据绑定.Style和Trigger < ...
- 【iOS】Quartz2D简单介绍
一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图 ...
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...
- 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理
Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...