Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.
Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.
1.Block语法总结及示例如下:
//1.普通代码块方式block
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {
// block code
};
使用未例:
int (^abc)(int a) = ^int(int a){
return a+1;
};
int aa = abc(2);
NSLog(@"%d",aa);
//2.属性方式block
@property (nonatomic, copy) returnType (^blockName)(parameterTypes);
使用示例:
1.定义属性
@property (nonatomic,copy) int (^testblock)(NSString *);
2.设置使用属性
[self setTestblock:^int(NSString *a) {
return 0;
}];
//3.方法参数block
- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName {
// block code
};
使用示例1:
1.无参数型定义及实现:
- (void)testBlockFun:(void(^)())completion{
NSLog(@"执行");
if (completion) {
completion();
}
}
2.无参数型block调用:
[self testBlockFun:^{
NSLog(@"回调结束");
}];
使用示例2:
1.带参数型定义及实现:
- (void)testBlockFun:(int (^)(int a,int b))complate{
if (complate) {
int c = complate(3,5);
NSLog(@"c:%d",c);
}
}
2.带参数型block调用:
[self testBlockFun:^int(int a, int b) {
return a+b;
}];
// 4.作为参数
[someObject someMethodThatTakesABlock: ^returnType (parameters) {
// block code
}];
使用示例:
1.定义及实现
- (void) testBlockFun:(void (^)(NSString *))complate{
if (complate) {
complate(@"success");
}
}
2.调用
[self testBlockFun:^(NSString *str) {
NSLog(@"str:%@",str);
}];
// 5.使用 typedef 定义
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^(parameters) {
};
使用示例:
typedef void (^blockTestName)(NSString *);
调用:
[self setName:^(NSString *a){
}];
2.Block修改值:使用__block可以在block内部修改外部变量的值。
__block int someIncrementer = 0;
[someObject someMethodThatTakesABlock:^{
someIncrementer++;
}];
3.Block循环引用,block会持有对象,block的对象也有block,会造成block的循环引用,解决方法:
__weak typeof(self) weakSelf = self;//@weakify(self);
[self someMethodThatTakesABlock:^{
[weakSelf action];
}];
Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.的更多相关文章
- Delegate, NSNotification, KVO, Block
delegate: 当我们第一次编写iOS应用时,我们注意到不断的在使用“delegate”,并且贯穿于整个SDK.delegation模式不是iOS特有的模式,而是依赖与你过去拥有的编程背景.针对它 ...
- BlocksKit初见:一个支持将delegate转换成block的Cocoa库
简介 项目主页: https://github.com/zwaldowski/BlocksKit BlocksKit 是一个开源的框架,对 Cocoa 进行了扩展,将许多需要通过 delegate 调 ...
- block存储区域——怎样验证block在栈上,还是堆上
Block存储区域 首先,须要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...
- block本质探寻三之block类型
一.oc代码 提示:看本文章之前,最好按顺序来看: //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"block1----&quo ...
- 环境变量、block、修饰符:block对环境变量的引用和修改需要通过修饰符来限定
环境变量.block.修饰符:block对环境变量的引用和修改需要通过修饰符来限定. http://www.cnblogs.com/fengmin/p/5816580.html - (NSUInteg ...
- Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
需求:在ViewController中,点击Button,push到下一个页面NextViewController,在NextViewController的输入框TextField中输入一串字符,返回 ...
- 63.delegate回调 和block回调
效果:viewController里面放置一个按钮和Lab,点击按钮进入oneViewController(delegate回调)或者BlockViewController(block回调),两者控制 ...
- 【转】block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
- [置顶] block一点也不神秘————如何利用block进行回调
我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...
随机推荐
- 从零开始写C# MVC框架之--- 项目结构
框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...
- 1、块:ion-item
因为ion-item 一般写于ion-list里 所以在ion-list里面我会仔细讲解. 1. ion-badge /* --- page1.html ---*/ <ion-navbar *n ...
- UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息
应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...
- 【学习笔记】实用类String的基本应用即常用方法
一.String类概述 在Java中,字符串被作为String类型的对象来处理. String类位于java.lang包中,默认情况下会自动导入到所有的程序中. 创建String对象的方法如下: St ...
- swagger快速开发
转载:https://blog.csdn.net/xxoo00xx00/article/details/77163399 swagger 学习笔记 搭建环境: 1,jdk1.8 2,idea 3,sp ...
- typeScript入门(一)构建环境和数据类型
最近入坑v-cli 3.0,发现ts越来越常用了,于是开始入坑学习. 1.构建ts环境 npm install -g typescript Mac和vscode用户可以用以下方式构建tsdemo项目 ...
- 前端路由vue-router介绍
一.前端路由vue-router介绍 Vue-Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模 ...
- win10下clodeblocks编译C语言乱码
打开settings->compile,在other compiler options添加下面两行代码: -fexec-charset=GBK-finput-charset=UTF-8
- matlab练习程序(随机游走图像)
随机游走类似布朗运动,就是随机的向各个方向走吧. 虽然代码没什么技术含量,不过产生的图像实在太漂亮了,所以还是贴上来吧. 产生的图像: matlab代码如下: clear all;close all; ...
- OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决 z
http://blog.csdn.net/wangjia184/article/details/6990098 http://www.openssl.org/ 在本地测试好好的代码部署到生产环境后,遇 ...