【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 ...
随机推荐
- C#读取配置文件的几种方式
配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <con ...
- C#生成验证码
生成验证码的类: using System; using System.Collections.Generic; using System.Drawing; using System.Text; na ...
- Objective-C语法简记
开始学习iPhone开发了,虽然现在已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,现在来学Objective-C,这篇只是一些很简 ...
- jquery.tagthis和jquery.autocomplete一起实现标签
目的 jquery.tagthis:http://www.dangribbin.co/jquery-tag-this/demo/ 使用tagthis控件实现标签的输入提醒功能,每个标签具有id和tex ...
- java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX
出现这个问题的解决方案就是将原有的jar删除 然后重新下载过一遍就可以使用了 我估计是元数据等损坏了
- 缓存MEMCACHE 使用原子性操作add,实现并发锁
memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添加,否则说 ...
- android 网络通讯
//get方式请求网络数据 String urlPath="http://192.168.98.112:8080/CloudMusicPlayer/fragment1_1_lv2/json/ ...
- 设计模式/原则篇- Unit of Work
概念 Unit of Work 即工作单元. 用来维护一组受业务影响的对象列表,将多个操作放在一个单元中,把操作原子化,通过事务统一完成一次提交,如果某个过程出现异常,就将所有修改进行回滚,保证数据的 ...
- Java Selenium封装--RemoteWebDriver
package com.selenium.driver; import java.io.File; import java.io.IOException; import java.net.URL; i ...
- 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能
UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...