【iOS】block的使用
Block 是iOS在4.0之后新增的程式语法,一般用于回调方法,功能上和delegate类似。本文将讲解block的几种常见的使用方法,当然,block中最值得注意的还是它的内存管理,我将在《》中讲到。
环境信息:
Mac OS X 10.9.5
Xcode 5.1.1
IOS 7.1
正文:
为什么要使用block?
1. 可代替delegate完成回调,而不需要像delegate那样繁琐
2. 在某些方面,可代替selector(如NSNotificationCenter在addObserver的时候,可以使用block,而不用单独定义方法)
3. 延长对象的生命周期(block会自动持有对象,这将在《》中讲到)
4. 提高代码的复用性和可读性
block结构
block的结构和C语言的函数指针结构类似,只是将函数指针的*换成了^
block结构示意图
如何使用?
一、直接在方法中定义
1. 无返回值无参数
定义:
void (^block) (void);
赋值:
block = ^{
NSLog(@"block的内容");
};
调用:
block();
2. 有返回值有参数
定义:
int (^block)(int a);
赋值:
int (^block)(int a) = ^int(int a) {
return a > 0 ? a : -a;
};
调用:
NSLog(@"%d", block(-10));
二、将block定义为属性
定义:
@property (nonatomic, copy) int (^block)(int a);
赋值:
Class *object = [[Class alloc] init];
object.block = ^int (int a, int b) {
return a > b ? a : b;
};
调用:
调用将会在Class内部进行,所以这里使用到的self是指上面的object对象。调用之前,最好先判断对象是否给block赋值,如果block为nil,调用block会导致程序崩溃。
if (_block) {
self.block(10);
}
三、在方法中将block作为参数传入
着这种用法中,我们通常会使用typedef为block取一个别名
定义:
typedef void(^Block)(int a);
- (void)nslogParameterWithBlock:(Block)block {
if (block) {
block(10);
}
}
赋值并调用:
[object nslogParameterWithBlock:^(int a) {
NSLog(@"%d", a);
}];
总结:
block使用方便,在项目中,合适的使用block也是你的代码看起来高端大气上档次,但是block的内存管理确实是一项非常重要也非常容易出错的地方,稍不注意便会造成内存泄露,所以,在使用block的时候,也要小心。
【iOS】block的使用的更多相关文章
- iOS Block界面反向传值
在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...
- iOS block从零开始
iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...
- iOS block 机制
本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...
- ios Block详细用法
ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...
- iOS Block的本质(四)
iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...
- # iOS Block的本质(三)
iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...
- iOS Block的本质(二)
iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...
- iOS Block的本质(一)
iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...
- (译)IOS block编程指南 1 介绍
Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...
- [IOS Block和delegate的对比]
原文:http://blog.sina.com.cn/s/blog_9e8867eb0102uykn.html 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和bloc ...
随机推荐
- Google C++ 风格指南 命名约定 转
命名约定 最重要的一致性规则是命名管理. 命名风格快速获知名字代表是什么东东: 类型? 变量? 函数? 常量? 宏 ... ? 甚至不需要去查找类型声明. 我们大脑中的模式匹配引擎可以非常可靠的处理这 ...
- 第23/24周 临时数据库(TempDb)
在今天的性能调优培训里我们讨论下TempDb——SQL Server的公共厕所,在SQL Server里我是这样描述它的.我们的每个人都会经常使用TempDb.有些人直接使用它,有些人不直接使用它.今 ...
- 【原创】验证代理IP是否有用
/// <summary> /// 验证代理IP是否有用 /// </summary> /// <param name="ip">IP地址< ...
- Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建
在较早时期,我写过一篇文章<结合Control.FirefoxDialog控件,构造优秀的参数配置管理模块>,介绍过在我的Winform框架基础上集成的参数配置模块功能,但是参数模块的配置 ...
- SQL Server - 数据库初识
在互联网笔试中,常遇到数据库的问题,遂来简单总结,注意,以 Sql Server 数据库为例. 数据库 数据库系统,Database System,由数据库和数据库管理系统组成. 数据库,Data ...
- js Date 时间格式化的扩展
js Date 时间格式化的扩展: Date.prototype.format = function (fmt) { var o = { , //月 "d+": this.getD ...
- 关于ASP.NET的“Forms身份验证”
目录结构如图如示: 如果用户没有通过身份验证则跳转到登录页面让用户登录,在配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验 ...
- ListView 下拉更新 (支持 Android)
注意:XE7 已提供下拉更的功能. 说明:展示如何在 Android 平台下,使用 ListView 下拉更新. 适用:Delphi XE5 , XE6 修改:需要修改到 Delphi 源码 FMX. ...
- 去掉Mybatis Generator生成的一堆 example
<table tableName="%" enableInsert="true" enableDeleteByPrimaryKey="true& ...
- java Servlet(续)
一.web.xml配置 由于需用户需要通过URL访问架设好的Servlet,所以我们必须将servlet映射到一个URL地址上, 比如上面的配置文件我们就可以通过:http://localhost:8 ...