首页 > 代码库 > Objective-C基础笔记(6)Block
Objective-C基础笔记(6)Block
Block(代码段)封装了一段代码,能够在不论什么时候运行。
Block能够作为函数參数或者函数返回值,而其本身又能够带输入參数或返回值。它和传统的函数指针非常相似,可是有差别:block是inline(内联函数)的,而且默认情况下它对局部变量是仅仅读的。
苹果官方建议尽量多用block.在多线程、异步任务、集合遍历、集合排序、动画转场用的非常多。
Block的定义:
int (^MySum) (int, int) = ^(int a, int b){
return a + b;
}
定义了一个叫MySum的block对象,它带有两个int參数,返回int类型,等号右边是block的详细实现。
void test(){ //定义了一个block,这个block返回值是int类型,接收两个int类型參数 int (^Sum) (int, int) = ^(int a, int b){ return a + b; }; int a = Sum(10, 11); NSLog(@"%i", a); }
void test2(){ //block能够訪问局部变量。但默认情况下不能改动 int c = 15; //使用__blockkeyword,变量能够在block中改动 __block int b = 25; MySum sum = ^(int a, int b){ NSLog(@"C is %i", c); b = 35; NSLog(@"B is %i", b); return a + b; }; NSLog(@"%i", sum(10, 10)); }在上一篇中我们实现了一个button监听器。这一篇我们使用block来实现button监听器。
#import <Foundation/Foundation.h> @class Button; typedef void (^ButtonBlock) (Button *); @interface Button : NSObject //这里临时用assign @property (nonatomic, assign) ButtonBlock block; //模拟button点击 - (void)click; @end在Button.h中我们定义了一个数据类型 void(^ButtonBlock) (Button *)。 然后定义一个该类型的成员变量 ButtonBlock block;
加入了一个成员方法 - (void)click;
#import "Button.h" @implementation Button - (void)click { _block(self); } @endButton.m文件里实现了 - (void)click方法
int main(int argc, const char * argv[]) { @autoreleasepool { Button *btn = [[[Button alloc] init] autorelease]; btn.block = ^(Button *btn){ NSLog(@"button%@被点击了", btn); }; //模拟button点击 [btn click]; } return 0; }最后在主函数中我们先获取button对象,然后给button对象中的block对象赋值。最后在模拟button点击事件的触发。
细心的朋友可能会发现,这里定义的block和c语言中的指向函数的指针特别想。两个对照方下:
int sum1(int a, int b){ return a + b; } void test3(){ //Block int(^sum)(int, int) = ^(int a, int b){ return a + b; }; //指向函数的指针 int (*sum1)(int, int) = sum1; //调用 sum(11, 11); sum1(10, 10); }
typedef int(^MySum) (int, int); typedef int (*sum2)(int, int);
Objective-C基础笔记(6)Block
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。