objective-c之block 总结
来源:互联网 发布:手机能改淘宝密码吗 编辑:程序博客网 时间:2024/06/06 01:56
一.基本概念
1.Blocks的定义:
int (^MySum)(int, int) = ^(int a, int b) {return a+b;};定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现Block可以访问局部变量,但是不能修改。int sum = 10;int (^MyBlock)(int) = ^(int num) {sum++;//编译报错return num * sum;};
2.block的赋值:
在声明的同时定义变量,然后赋值int (^MySum)(int,int) = ^(int a,int b) {return a + b;};也可先用typedef先声明类型,再定义变量进行赋值typedef int (^MySum)(int,int);MySum sum = ^(int a,int b) {return a + b;};
二.基本使用
/** 定义了一个没有返回值没有参数的block */void test(){ // 定义简单的block变量 // block跟函数很像: 返回值、参数 void (^logStar)() = ^{ NSLog(@"***************"); NSLog(@"***************"); NSLog(@"***************"); }; logStar();}
/** 定义了一个没有返回值 但有参数的block */void test2(){ // 定义block变量, 存储一段代码, 这段代码的功能是能打印任意行数的**** void (^logStarBlock)(int) = ^(int numberOfLines){ for (int i = 0; i<numberOfLines; i++) { NSLog(@"***************"); } }; logStarBlock(1);}
/** 定义了一个有返回值有参数的block */void test3(){ // 定义一个block计算两个整数的和 int (^sumBlock)(int, int) = ^(int num1, int num2) { return num1 + num2; }; int c = sumBlock(10, 9); // 定义一个block计算一个整数的平方 int (^pinfangBlock)(int); pinfangBlock = ^(int num){ return num * num; }; pinfangBlock = ^(int num) { return num + 2; }; int d = pinfangBlock(10); NSLog(@"d is %d", d);}
Block和typedef
#import <Foundation/Foundation.h>// 定义一个叫做MyBlock的类型// 利用MyBlock类型可以定义block变量// 利用MyBlock类型定义出来的变量, 存储的代码必须返回int, 必须接受2个int类型的参数typedef int (^MyBlock)(int, int);int main(int argc, const char * argv[]){ @autoreleasepool { MyBlock minusBlock = ^(int num1, int num2) { return num1 - num2; }; MyBlock multiBlock = ^(int num1, int num2) { return num1 * num2; }; multiBlock(10, 1); } return 0;}void test(){ // 定义一个block来计算2个整数的差 int (^minusBlock)(int, int) = ^(int num1, int num2) { return num1 - num2; }; // 定义一个block来计算2个整数的积 int (^multiBlock)(int, int) = ^(int num1, int num2) { return num1 * num2; };}
模拟block使用场景
#import <Foundation/Foundation.h>typedef void (^WorkBlock)();void goToWork(WorkBlock workBlock){ NSLog(@"起床"); NSLog(@"刷牙"); NSLog(@"穿衣服穿鞋"); NSLog(@"出门"); NSLog(@"搭公交"); NSLog(@"抵达公司"); // 实事 // 调用block之前一定要做判断 if (workBlock != nil) { workBlock(); } // 实事 NSLog(@"叮咚叮咚 下班了"); NSLog(@"搭公交"); NSLog(@"回家"); NSLog(@"睡觉");}/** 模拟星期一上班的具体情况 */void goToWorkInDay1(){ goToWork(^{ NSLog(@"了解项目的需求"); });}void goToWorkInDay2(){ // 实事 goToWork(^{ NSLog(@"熟悉公司以前的代码"); }); // 实事}void goToWorkInDay3(){ // 实事 goToWork(^{ NSLog(@"开始编写代码"); }); // 实事}void test(int (^myblock)(int num1, double num2, char num3)){ }int main(int argc, const char * argv[]){ @autoreleasepool {//// goToWorkInDay3();// test(^int(int num1, double num2, char num3) {// // }); // WorkBlock block = ^{// NSLog(@"-------------------");// };// // goToWork(block); } return 0;}
场景二:
#import "ViewController.h"typedef void (^FINISHED)();@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self loadData]; [self loadData2:^{ NSLog(@"执行回调"); }]; [self loadData3:@"lnj" finished:^{ NSLog(@"执行回调"); }];}- (void)loadData2:(void (^)())finished { NSLog(@"耗时操作"); finished();}- (void)loadData3:(NSString *)name finished:(void (^)())finished{ NSLog(@"name = %@", name); finished();}- (void)loadData{ dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"耗时操作 %@", [NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"回到主线程更新UI %@", [NSThread currentThread]); }); });}@end
三.block进阶使用
1.避免block循环引用
结合AFNetworking的源码发现有下面几种写法均可:
// AFNetworking的写法__weak __typeof(&*self)weakSelf = self;// 我之前一直这么写的__weak __typeof(self) weakSelf = self;// 或者这么写__weak XxxViewController *weakSelf = self;// 或者这么写__weak id weakSelf = self;
2.block回调
http://blog.csdn.net/sunnyboy9/article/details/51246882
3.block链式编程
0 0
- objective-c之block 总结
- objective-c基础之block
- Objective-C之Block剖析
- 黑马程序员 之 Objective-C 初识block
- Objective-C 基础知识之(十一):Block
- Objective-C研究之Block的使用
- Objective-C之block详细介绍
- objective-c block 讲解
- objective-c block 讲解
- objective-c block 详解
- objective-c block 讲解
- objective-c block 讲解
- Objective-C block
- objective-c block 详解
- objective-c block 详解
- Objective-C中的Block
- Objective-C中的Block
- objective-c block 详解
- leetcode-09-Palindrome Number
- Java简介
- LightOj 1220 Fantasy of a Summation(快速幂)
- 前端开发学习笔记02----HTML基础
- 人见人爱A^B
- objective-c之block 总结
- 在Eclipse中打开工程中的drawable里面的PNG格式的图片报错,找不到应用程序
- java实现子字符串的BM算法
- kafka源码解析之十一KafkaApis
- Jmeter和Tsung之间的对比
- Mod of power 2 on bitwise operators?
- 怎么设置JLabel内容对齐方式
- QPushButton类
- [025]Java矩阵运算——jama