在这个大冬天里默默敲着键盘,勿喷.今天学习swift过程中,学习到闭包,发现闭包和oc的block中有很多的相同之处,又重新学习了一下并且学习了一些高级点的用法,内容如下:

1.block格式说明:(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};//如果没有参数,等号后面参数列表的()可以省略
例子:

void(^demoBlock)() = ^ {

NSLog(@"demo Block");

};

int(^sumBlock)(int, int) = ^(int x, int y) {

return x + y;

};

2.block中使用的变量将以复制的形式保留,在block中保留block的复制的变量,默认情况下,Block外部的变量,在Block中是只读的!当使用__block关键字后,同样可以在Block中修改外部变量的数值.
 
3.可以使用typedef定义一个Block的类型,便于在后续直接使用,如:

typedef double(^MyBlock)(double, double);

MyBlock area = ^(double x, double y) {

return x * y;

};

MyBlock sum = ^(double a, double b) {

return a + b;

};

NSLog(@"%.2f", area(10.0, 20.0));

NSLog(@"%.2f", sum(10.0, 20.0));

4.尽管,typedef可以简化Block的定义,但在实际开发中并不会频繁使用typedef关键字,这是因为Block具有非常强的灵活性,尤其在以参数传递时,使用Block的目的就是为了立即使用

官方的数组遍历方法声明如下:

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;

而如果使用typedef,则需要:
(1)typedef void(^EnumerateBlock)(id obj, NSUInteger idx, BOOL *stop);
(2)- (void)enumerateObjectsUsingBlock:(EnumerateBlock)block;

而最终的结果却是,除了定义类型之外,EnumerateBlock并没有其他用处

 
5.Block可以被当做参数直接传递

NSArray *array = @[@"张三", @"李四", @"王五", @"赵六"];

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

NSLog(@"第 %d 项内容是 %@", (int)idx, obj);

if ([@"王五" isEqualToString:obj]) {

*stop = YES;

}

}];

或者:

MyBlock sumBlock = ^(double x, double y) {
    return x * y;
    
};

- (void)add:(int)number withNumber:(int)withNumber sumBlock:(MyBlock) block
{
   
    NSLog(@"执行add:(int)number withNumber:(int)withNumber sumBlock:(void (^)(void))block");
    NSLog(@"hahaha--4和2相乘等于:%f",block(number,withNumber));

}

[self add:4 withNumber:2 sumBlock:sumBlock];

6.既然Block是一种数据类型,那么可以将Block当做比较特殊的对象,添加到数组

#pragma mark 定义并添加到数组

@property (nonatomic, strong) NSMutableArray *myBlocks;

int(^sum)(int, int) = ^(int x, int y) {

return [self sum:x y:y];

};

[self.myBlocks addObject:sum];

int(^area)(int, int) = ^(int x, int y) {

return [self area:x y:y];

};

[self.myBlocks addObject:area];

#pragma mark 调用保存在数组中的Block

int(^func)(int, int) = self.myBlocks[index];

return func(x, y);

7.解除循环引用

局部变量默认都是强引用的,离开其所在的作用域之后就会被释放
 
使用__weak关键字,可以将局部变量声明为弱引用

__weak DemoObj *weakSelf = self;

n在Block中引用weakSelf,则Block不会再对self做强引用

int(^sum)(int, int) = ^(int x, int y) {

return [weakSelf sum:x y:y];

};

8.今天重点,参考AFN的框架,block根据函数判断正确与否调用success或者failure函数参数,并传入参数.如下:

//由于主要还是用来判断success和failure函数,所以看着不舒服的同学可以自行脑补,将success换成add,将failure换成multiplied

- (void)viewDidLoad {
    [super viewDidLoad];
    self.isbool = true;//当isbool等于true的时候就相加,否则就相乘
 
    [self setCompletionBlockWithSuccess:^(int x,int y) {
        NSLog(@"相加等于:%d",x+y);
       
       NSLog(@"success");
   
       
    } failure:^(int x,int y) {
        
        NSLog(@"相乘等于:%d",x*y);
        NSLog(@"failure");
        
    
    }];

}

- (void)setCompletionBlock:(void (^)(void))block {
 
        block();
    NSLog(@"setCompletionBlock number2:%d number3:%d",self.number2,self.number3);
}

- (void)setCompletionBlockWithSuccess:(void (^)(int x,int y))success
                              failure:(void (^)(int x,int y))failure
{

self.completionBlock = ^{
    
         self.number2 = 10;
         self.number3 = 20;

if (self.isbool == true) {//判断传入哪个参数,执行success还是failure
             NSLog(@"开始相加");
             success(self.number2,self.number3);//参数传入setCompletionBlockWithSuccess
         }else{
              NSLog(@"开始相乘");
             failure(self.number2,self.number3);//参数传入setCompletionBlockWithSuccess
         }
     };

}

9.block遍历

enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop){   }

 
 
 

ios 中的block应用的更多相关文章

  1. IOS中的Block与C++11中的lambda

    ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...

  2. iOS 中使用Block时需要注意的retain circle

    现在在ios中,block是越来越多了.自己在类中定义block对象时,需要注意block对象的使用方法,防止产生retain circle,导致内存泄露. 现在分析一下产生retain circle ...

  3. iOS中使用block进行网络请求回调

    iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...

  4. iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  5. iOS 中的 block 是如何持有对象的

    Block 是 Objective-C 中笔者最喜欢的特性,它为 Objective-C 这门语言提供了强大的函数式编程能力,而最近苹果推出的很多新的 API 都已经开始原生的支持 block 语法, ...

  6. iOS开发——高级篇——iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  7. iOS 中的block异常

    转自:iOS 知识小集 我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64 ...

  8. iOS 中的 Block

    参考:链接 (1)block作为本地变量(local variable) returnType (^blockName)(parameterTypes) = ^returnType(parameter ...

  9. iOS 中的block异常 判断block是否为空

    我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常[32位下的结果,如果是64位,则address=0 ...

随机推荐

  1. [MongoDB] Query, update, index and group

    /* 1. Query Operators */ db.posts.find({ viewsCount: {$get: 1000, $lte: 3000} }, {_id: 0, viewsCount ...

  2. Xcode常见的编译、运行等错误的解决

    Xcode常见的编译.运行等错误的解决 项目没找到Info.plist的错误 The solution for this particular instance of the error was “I ...

  3. javascript 拷贝

    拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象. 浅拷贝 function copy(source,destiny){ destiny = destiny || {}; if(typ ...

  4. DropDownList的多级联动

    DropDownList的多级联动的问题最典型的案例就是实现省市级三级联动的案例,对这个问题的描述是当选中山东省之后,在选择市的下拉菜单时,市一栏只出现山东省下面的市.对于县也是同样的道理. 我也做的 ...

  5. cocos2d-x在android下的编译

    $(call import-add-path,E:/cocos2d-2.0-x-2.0.3) include $(BUILD_SHARED_LIBRARY) http://www.cnblogs.co ...

  6. Graylog2+mongdb+rsyslog中央日志服务器对syslog的web管理--转载

    原文地址:http://blog.sina.com.cn/s/blog_49be4d570100yvv1.html 1.下载mongodb,可以通过下面2中方法安装. (1)官网下载yum源后直接安装 ...

  7. cocos2d-x lua 使用ListView

    cocos2d-x lua 使用ListView version: cocos2d-x 3.6 本文主要讲述:使用Cocos Studio创建ListView,和列表项的模板,代码中通过模板创建列表的 ...

  8. 写一个函数,将一个int型的数组做为参数传入,使用指针返回两个结果:最大值和最小值

    今日下午研究了一下c语言中的指针问题,c语言的核心是指针,指针的核心是地址,地址的核心是内存. #include <stdio.h> void hanshu(int *arry,int s ...

  9. hdu 1228 A+B 字符串处理 超级大水题

    中文意思不解释. 很水,我本来想用switch处理字符串,然后编译不通过...原来switch只能处理整数型的啊,我都忘了. 然后就有了很挫的一大串if代码了... 代码: #include < ...

  10. VS2013 支持python和nodejs

    一.在VS2013中,安装python的支持 1. http://pytools.codeplex.com/下载插件 2. https://www.python.org/download/下载Pyth ...