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(23);
    }
}
- (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(24);
    }
}

void(^printNumBlock)(int) = ^(int num){
    NSLog(@"int number is %d",num);
};
int sayHello(int m){
    printf("sayHello %d\n",m);
    return m + 1;
}

- (void)functionUser{
    function2(sayHello); //函数作为参数掉用
}

3.返回值

- (void)blockImp{
    [self block3](25);
}

- (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 == 1) {
        return add;
    }else{
        return sub;
    }
}

- (void)functionUser{
    int (*m)(int, int)  = function3(2); //函数作为参数
    int ok = m(1,2);
    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(12).setName(@"gulong");
    NSLog(@"%@",person);
时间: 2024-11-08 14:39:21

Block 代码快的相关文章

Arc 自动内存管理 分类Category 类扩展 Block 代码段 和 Protocol协议的一些简单知识的总结

1. Arc的使用 Arc是自动内存管理: arc的使用原则 1).只要对象没有任何强类型指针引用就会被释放’. 2).只要对象被任何强类型指针指引就不会被释放. 弱指针:__weak 被__weak修饰的指针就被称为弱型指针: 强类型指针 默认的指针都是强类型指针: 被__strong修饰的指针也是强类型指针. 使用Arc时可以重写dealloc方法,但是在重写方法时不能手动调用[super dealloc]: 在Arc中通过@property生成的属性如果是OC的对象那么要用Strong来修

block 代码块 反向传值

block 代码块 也称作闭包 与C语言函数类似  具有反向传值.回调的功能 block公式分两种: ①声明和实现写到一块的公式 返回值类型(^block名字)(参数列表 参数类型 参数名) = ^(参数列表 参数类型 参数名){ 实现代码(如果有返回值 需要return 返回值类型的值) }; 调用:block名字(参数); ②声明和实现分开写的公式 (1)声明 返回值类型(^block名字)(参数列表); (2)实现 block名字 = ^(参数列表){ 实现代码(如果有返回值 需要retu

IOS Block代码块的定义与使用

代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值.     脱字符是代码块的语法标记.下图表示代码块的定义. 1.代码块的基本使用 //无参数无返回值 void (^myblock)() = ^() { NSLog(@"Hello, World!"); }; myblock(); //带参数无返回值 void (^myblock2)(NSString *string) = ^(NSStri

java 成员变量 静态变量代码块 静态代码快加载顺序

序言 基类A 类B继承实现了A类 1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,开始进行实例化1,在实例化子类B时,先要实例化父类A2,实例化父类A时,先成员实例化(非静态代码)3,父类A的构造方法4,子类B的成员实例化(非静态代码)5,子类B的构造方法

Block代码块分析

1.block 在程序运行中保存一段代码 block标志:^ 可以保存代码,有返回值,有形参 2.定义block变量 int (^sumblock)(int, int); 3.block默认可以访问外面的变量,不可以修改外面的局部变量 给局部变量加上_block关键字,这个局部变量就可以在block内部修改 4. //没有形参没有返回值的block void(^myblock)() = ^{ NSLog(@"没有返回值的block"); }; //当调用block时才会执行,调用方法:

iOS:使用block代码块实现事件处理过程中的回调

block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟java中的匿名内部类相似,但是,记住,它是一种基本数据类型: 第二点:在类中声明block为属性时,如果使用assgin修饰,那么它被放到了栈中,方法已过就会被销毁,所以,尽量使用copy作为修饰词,这样一来block就被存放到了堆中,生命周期就会延长,保证block不会被立即销毁: 第三点:要防止循环

黑马程序员-block代码块和protocol协议

一.block block是一个变量,这个变量类似c语言中的函数指针,在回调场合用的特别多.它可以封装代码,有返回值有形参.下面通过代码来说明block的定义和使用. 首先来看没有返回值没有形参的block 1 void (^myblock)() = ^{ 2 NSLog(@""); 4 }; 有返回值有形参的block 1 int (^sumblock)(int, int) = ^(int a, int b){ 2 return a + b; 3 }; 4 5 int c = sum

block代码块介绍

关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的函数对象,因为除了要执行的代码,block还可以携带和block绑定的状态信息. 代码块的结构 代码块的简单赋值与调用 // 将block块赋值给一个变量testblock,然后直接通过变量来调用代码块中的代码 int(^testblock)(int a, int b) = ^(int a, int

iOS开发关于Block代码错误

本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html?,转载请注明出处. Incompatible block pointer types sending 'void (^)([ClassNameA]] *__strong)' to parameter of type '[BlockName]' (aka 'void (^)([ClassNameB]] *__strong)') 典型传参错误,[BlockName]应该传参[ClassNa