OC__block用法
来源:互联网 发布:windows系统漏洞 编辑:程序博客网 时间:2024/06/01 17:17
//// main.m// Block//// Created by student on 16/1/13.// Copyright © 2016年 niit. All rights reserved.//#import <Foundation/Foundation.h>int gNumber = 100;typedef void (^MyBlockType2)(int);//函数,一个参数是int型,另一个是block类型void repeat(int n,MyBlockType2 aBlock){ for (int i=0; i<n; i++) { aBlock(i); } }int main(int argc, const char * argv[]) { @autoreleasepool {/* 关于block block值 一段代码 block变量 存放代码块的变量 ^ block的语法标记 block和函数很类似 1)一段代码,实现一段功能 2)有参数,返回值,调用方式一样*/#pragma mark 第一个block例子 // int mutiplier = 7; int (^foo)(int); //定义一个block变量 //类型 int (^)(int) foo = ^(int num){ return num*mutiplier; }; //执行block// NSLog(@"%i",foo(3)); #pragma mark 如何定义使用block //格式: //返回值(^block变量名)(参数列表) = ^(参数列表){具体代码};#pragma mark 最简单的block(无参数,无返回值) //(无参数,无返回值)的block值 /* ^() { NSLog(@"hello world!"); }; //一个block的变量(无参数,无返回值)的block变量 void(^aBlock)(void); aBlock = ^(){ NSLog(@"hello world"); }; //执行调用block aBlock(); */#pragma mark 2带参数带返回值的block /* void(^bBlock)(int); void(^cBlock)(int,int); int (^dBlock)(int,int); bBlock = ^(int num){ NSLog(@"传入的值是%i,平方=%i",num,num*num); }; cBlock = ^(int num1,int num2){ NSLog(@"%i + %i =%i",num1,num2,num1+num2); }; dBlock = ^(int num1,int num2) { return num1+num2; }; bBlock(10); cBlock(20,30); int result = dBlock(40,50); NSLog(@"%i+%i=%i",40,50,result); */#pragma mark block中使用全局变量和局部变量 void(^eBlock)(void) = ^(){ gNumber++; NSLog(@"gNumber=%i",gNumber); }; eBlock(); NSLog(@"gNumber=%i",gNumber);#pragma mark block局部变量// int localNumber = 500; //block外的局部变量,可以访问,但是不能修改// // void(^fBlock)(void) = ^(){//// localNumber++; //会报错// NSLog(@"localNumber = %i",localNumber);// };// fBlock(); __block int localNumber = 500; //加上__block关键字,block中可以修改局部变量 void(^fBlock)(void) = ^(){ localNumber++; NSLog(@"localNumber = %i",localNumber); }; fBlock();#pragma mark 用typedef给block起别名 int(^gBlock)(int,int);//gBlock是block变量 gBlock = ^(int n1,int n2){ return n1-n2; }; typedef int (^MyBlockType)(int,int);//int (^)(int,int) =>MyBlockType MyBlockType hBlock;//用别名定义hBlock变量 hBlock = ^(int n1,int n2){ return n1*n2; }; #pragma mark block作为函数、方法的参数及返回值 MyBlockType2 iBlock = ^(int n){ NSLog(@"%i",n*n); }; repeat(10, iBlock); #pragma mark 练习 // 1 定义一个block变量并赋值,功能是打印100个* void(^printBlock)() = ^(){ for (int i=0; i<10; i++) { NSLog(@"**********"); } }; printBlock(); // 2 定义一个block求1+2+3+...+n int(^plusBlock)(int) = ^(int n){ int result=0; for (int i = n; i>0; i--) { result = result+i; } return result; }; NSLog(@"%i",plusBlock(5)); // 3 定义一个block求平方 int(^pfBlock)(int) = ^(int n){ return n*n; }; NSLog(@"%i",pfBlock(5)); // 4 定义一个block求三个书中最小值 int(^minBlock)(int,int,int) = ^(int a,int b,int c){ if (a<b&&a<c) { return a; } else if (b<c){ return b; } else{ return c; } }; NSLog(@"%i,%i,%i中最小数是%i",12,25,24,minBlock(12,25,24));#pragma mark block应用 //遍历字典和数组 } return 0;}
#pragma mark block应用 //遍历字典和数组 NSDictionary *aDict = @{@"1001":@"张三", @"1002":@"李四", @"1003":@"王五", @"1004":@"赵六", }; NSArray *arr = @[@"小明",@"小王",@"小红"]; [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //遍历代码 NSLog(@"%@ 下标%i",obj,idx); if ([obj isEqualToString:@"小王"]) { *stop = YES;//遇到小王,停止遍历 } }]; [aDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { NSLog(@"%@,%@",key,obj); }];
0 0
- OC__block用法
- 用法
- ,, 用法
- 用法
- 用法
- #用法
- ??用法
- !!用法
- CustDialog用法 SimpleAdapter 用法
- hibernate_Restrictions用法 hibernate_Restrictions用法
- extern用法+assert用法
- getParameterValues用法
- rpm用法
- Log4j用法
- NameSpace用法
- sp_executesql 用法
- ShellExecute用法
- getParameterValues用法
- 创新的名人例子
- Javascript判断对象和字符串为空的优雅写法
- Visual Studio 外请版本管理插件 - AnkhSVN
- Android adb shell启动应用程序的方法
- Fiddler 监听手机请求地址详细教程
- OC__block用法
- 电视家2.0电脑版
- I18N、G11N、L10N的区别?
- laravel框架自带缓存学习,和一些缓存的区别理解
- Apache通过代理拦截请求
- 数组初始化才能使用
- 给qemu虚拟机加硬盘,分区,自动挂在
- 用bootstrap写弹窗,页面抖动问题
- ubuntu安装mac主题