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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 陪婆婆聊天心情超级郁闷怎么办? 他不想理你了怎么办 陌陌看到信息不回怎么办 qq的文档看不了怎么办 怀孕了分手了怎么办啊 qq节日祝福关了怎么办 微信欠款不还怎么办 qq文件记录删除了怎么办 qq漫游记录删了怎么办 换了新手机微信怎么办 新手机了微信怎么办 微信收藏空间已满怎么办 微信收藏空间满了怎么办 qq步数上传不了怎么办 qq发送的文件失效了怎么办 苹果手机微信数据损坏怎么办 微信文件被清理怎么办 老婆与别人聊暧昧话题怎么办 微信不小心删了聊天记录怎么办 当聊天没话题了怎么办 老婆和别人频繁聊天老公怎么办 qq上把人屏蔽了怎么办 注册微信验证码发不出去怎么办 两个人在一起没有话题怎么办 两个人聊天没话题怎么办 qq邮箱限制信用卡账单怎么办 和朋友聊天没话题怎么办 跟朋友聊天没话题怎么办 和朋友聊天找不到话题怎么办 qq加好友忽略了怎么办 微信加好友收不到验证消息怎么办 陌陌距离乱了怎么办 qq不能点赞了怎么办 快递发货地址写错了怎么办 订的海鲜不发货怎么办 拉人进群频繁了怎么办 qq群邀请过于频繁怎么办 qq一直被拉进群怎么办 qq号被冻结解封不了怎么办 2018qq自动进群怎么办 手机视频传到电脑倒着怎么办