4、OC 块(Block)
来源:互联网 发布:java贪吃蛇文档 编辑:程序博客网 时间:2024/06/08 05:20
OC中块可以更好的简化Objective-C编程,在OC中很常用
一、快的基本语法
定义块的语法格式如下:
^[块返回值类型](形参类型1 形参1,形参类型2 形参2.....)
{
//快执行体
}
需要注意:
1.定义块必须以^开头
2.定义块的返回值类型可以省略
3.定义块无需指定名字
4.如果块无参数,参数部分的括号不能省略,可以为空,通常使用void作为占位符
如果程序需要多次调用已经定义的块,则需要将该块赋给一个块变量
//定义不带参数,无返回值的块 void (^printName)(void) = ^(void){ NSLog(@"小明"); }; //调用块 printName(); //定义带参数,带返回值的块 int (^getAgeWithName)(NSString*) = ^int(NSString* name){ if ([name isEqualToString:@"小明"]) { return 20; }else{ return 10; } }; //输出:小明年龄:20 NSLog(@"小明年龄:%d",getAgeWithName(@"小明")); //先定义块变量 void (^printAge)(NSString*); printAge = ^(NSString* name){ if ([name isEqualToString:@"小明"]) { NSLog(@"小明"); }else{ NSLog(@"不是小明"); } }; //输出:不是小明 printAge(@"SSS");
二、块与局部变量
块可以访问局部变量的值,但不允许修改局部变量的值
int length = 30; void (^printL)(void)=^(void){ //报错 length = 40; };
当程序使用块访问局部变量时,系统在定义块时就会把局部变量的值保存在块中,而不是在执行时才去访问,如下
int main(int argc, const char * argv[]) { @autoreleasepool { int length = 30; void (^printL)(void)=^(void){ NSLog(@"length=%d",length); }; length = 40; //输出:length=30 printL(); } return 0;}
如果希望块能过在执行时再去访问,获取局部变量的值,或者改变变量的值,则需要在局部变量前使用_block修饰
int main(int argc, const char * argv[]) { @autoreleasepool { __block int length = 30; void (^printL)(void)=^(void){ //__block修饰后,可以在运行时访问局部变量 NSLog(@"length=%d",length); //__block修饰后,可以修改变量的值 length = 50; NSLog(@"length=%d",length); }; length = 40; //输出:length=40 // length=50 printL(); } return 0;}
三、使用typedef定义块变量类型
定义快变量类型主要有2个用途
1.复用快变量类型,使用块变量类型可以重复定义多个块变量
2.使用块变量类型定义函数参数,这样就可以定义带块参数的函数
使用typedef定义块变量类型的语法格式如下:
typedef 块返回值类型 (^块变量类型)(形参类型1,形参类型2...);
使用块类型重复定义多个变量
int main(int argc, const char * argv[]) { @autoreleasepool { //使用typedef定义块变量类型PrintNessage typedef void (^PrintNessage)(NSString*); //使用块变量类型定义块变量,并将指定块赋给该变量 PrintNessage printM1 = ^(NSString* info){ NSLog(@"1: %@",info); }; PrintNessage printM2 = ^(NSString* info){ NSLog(@"2: %@",info); }; //调用块 //输出:1: MM printM1(@"MM"); //输出:2: MM printM2(@"MM"); } return 0;}
使用块变量类型作为函数参数
#import <Foundation/Foundation.h>//定义一个块变量类型typedef void (^PrintBlock)(int,NSString*);//定义一个函数,将块作为最后一个参数void printMessage(int age,NSString* name,PrintBlock pb){ age = age+5; pb(age,name);}int main(int argc, const char * argv[]) { @autoreleasepool { printMessage(10, @"小明", ^(int age,NSString* name){ //输出:age = 15,name=小明 NSLog(@"age = %d,name=%@",age,name); }); } return 0;}
0 0
- 4、OC 块(Block)
- OC代码块block
- OC------block块的使用
- Oc课堂笔记->Block块
- OC之Block块语法
- OC 6 Block块语法
- 黑马程序员------OC中代码块(block)的总结
- 黑马程序员------OC block(代码块)和protocol(协议)
- OC-Block-块的说明和使用
- OC教程6-代码块block回调
- OC中的Block(块语法)相关知识
- 转载:OC中的代码块block
- OC-----------Block块的注意点
- OC学习 第十四章 Block代码块
- OC中块Block的用法
- 代码块(block)
- 【IOS 开发学习总结-OC-7.6-★】objective-c ——块(Block)
- OC之Block块,以及对数组进行排序
- base64服务端与客户端加解密交互
- C#和使用中的23个技巧
- ubuntu12.04 gcc g++ 4.4
- java源码如何创建线程
- 黑马程序员——C语言基础——数组和字符串
- 4、OC 块(Block)
- 第15周上机实践项目3——在OJ上玩指针(3)
- unity之多态和索引
- python如何设计公共类
- Why struts2 + springMVC + spring for web
- Object-C加强 分类以及扩展
- 请求重定向和请求转发的区别
- Android4.4 Framework分析——Activity窗口的创建过程(一)
- 手机App开发的有关问题