Block 代码快
1.原理
1.1block类型
a.全局bock块 贯彻整个程序
b.栈块 存在于栈内存中,作用域中使用
c.堆块 自行管理其内存
注*:http://blog.parse.com/learn/engineering/objective-c-blocks-quiz/ 检验自己了解情况
1.2定义
类函数,闭包
注*:1.block捕获块中出现的外部变量
2.栈块copy之后会形成堆块
3.__weak(ARC)或__block(MRC)来避免循环引用
4.若想深入了解可使用C++理解(clang -rewrite-objc 源代码文件名)
2.使用
函数和block对比进行
1.调用
- (void)blockImp{
//只有调用Block时候,才会执行其{}体内的代码
[self block1];
}
- (void)block1{
void (^mm)(int) = ^(int index){
NSLog(@"block1 index = %d",index);
};
if (mm) {
mm();
}
}
- (void)functionUser{
function1("Mr huang"); //简单函数调用
}
void function1(char * name){
printf("Hello %s\n",name);
}
2.形参
- (void)blockImp{
[self block2:^(int index) {
NSLog(@"block2 index = %d",index);
}];
//函数定义不能在 方法内部,而block可以。
[self block2:printNumBlock];
}
- (void)block2:(void(^)(int))block{
if (block) {
block();
}
}
void(^printNumBlock)(int) = ^(int num){
NSLog(@"int number is %d",num);
};
int sayHello(int m){
printf("sayHello %d\n",m);
return m + ;
}
- (void)functionUser{
function2(sayHello); //函数作为参数掉用
}
3.返回值
- (void)blockImp{
[self block3]();
}
- (void(^)(int))block3{
return ^(int index){
NSLog(@"block3 index = %d",index);
};
}
int add(int a , int b){
return a + b;
}
int sub(int a , int b){
return a - b;
}
void * function3(int i){
if (i == ) {
return add;
}else{
return sub;
}
}
- (void)functionUser{
int (*m)(int, int) = function3(); //函数作为参数
int ok = m(,);
printf("ok %d\n",ok);
}
3.链式编程
3.1.第三方链式 (Masory)
3.2.自定义
#import <Foundation/Foundation.h> @interface GLPerson : NSObject @property(nonatomic , assign)NSInteger age; @property(nonatomic , copy)NSString * name; - (GLPerson *((^)(NSString *)))setName; - (GLPerson *((^)(NSInteger)))setAge; @end
#import "GLPerson.h"
@implementation GLPerson
-(NSString *)description{
return [NSString stringWithFormat:@"name = '%@';age = %ld",_name,_age];
}
- (GLPerson *((^)(NSString *)))setName{
return ^(NSString * name){
self.name = name;
return self;
};
}
- (GLPerson *((^)(NSInteger)))setAge{
return ^(NSInteger age){
self.age = age;
return self;
};
}
@end
GLPerson *person = [[GLPerson alloc] init];
person.setAge().setName(@"gulong");
NSLog(@"%@",person);
Block 代码快的更多相关文章
- iOS-动画效果(首尾式动画,代码快动画,核心动画,序列帧动画)
一.各个动画的优缺点 1.首尾动画:如果只是修改空间的属性,使用首尾动画比较方便,如果在动画结束后做后续处理,就不是那么方面了. 2.核心动画:有点在于对后续的处理方便. 3.块动画: (1)在实际的 ...
- iOS开发关于Block代码错误
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...
- block(代码块)的介绍以及使用方法和变量之间的关系
http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...
- Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法
JVM运行之前会执行一个叫做类加载器的子系统,叫做ClassLoader,那么类里面那么多“元素”,究竟是个什么顺序呢,写几行代码测试一下,通过给每个方法和代码快和静态变量打上断点来测试: class ...
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
- iOS - Block 代码块
1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...
- block代码块介绍
关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...
- IOS学习4——block代码块
本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...
- IOS Block代码块的定义与使用
代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值. 脱字符是代码块的语法标记.下图表示代码块的 ...
随机推荐
- Java设计模式——线程安全的单件模式
单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...
- jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法
$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...
- JavaScript基本数据类型和引用数据类型
ECMAScript包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型值那些可能有多个值构成的对象. 在进行变量赋值时,解析器必须确定这个值是基本类型值还是引用 ...
- dSYM 文件分析工具
来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异 ...
- MVP解析
一套可以直接复制使用的MVP框架 通过对MVP设计模式学习,对MVP也有了一个初步的认识,以登录Login模块为例,封装MVP如下: package com.example.administrator ...
- ASP.NET MVC 让@Html.DropDownList显示默认值
在使用@Html.DropDownList的过程中,发现它的用法很局限,比如在加载的时候显示设定的默认项或者调整它的显示样式,在网上查了一些资料,终于把这个问题解决了. 一.View代码 @using ...
- 一道关于java序列化的问题,看大家知多少————
问题先放在这里,稍后我会做出解答 已知类有Test和Test2,问两次主程序的输出结果是多少(SerializeUtil只是序列化的工具类) 类Test public class Test imple ...
- 尝试解析js面试题(一)【转发】
解析: 1.Foo.getName(); //2 1)结果执行的是Foo对象的一个叫做getName()的属性,而1.4.5中的getName都是作为函数存在,所以可以排除1.4.5 2)剩下两个中, ...
- 办公OA的登陆界面..
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- RabbitMq 集群搭建
实验环境: 操作系统为 Centos 7.2 IP hostName 192.168.190.132 node132 192.168.190.139 node139 192.168.190.1 ...