5 0.OC16-Block
Block
1)、Blocks封装了一段代码,可以在任何时候执行
2)、Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline(内联函数的),并且默认情况下它对局部是只读的
3)、苹果官方建议尽量多用blocks。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
Blocks的定义
例一
Main.m
// // main.m // OC10-内存管理2-set方法的内存管理 // // Created by qwz on 13-12-9. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h> #import "Button.h"
typedef int (^mySum) (int, int) ;
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有2个下划线 __block int c = 15;
//声明了一个block变量 mySum sum = ^(int a, int b){ //如果外部的变量用了__block关键字,就可以在block内部修改这个变量 c = 19; //block可以访问外面定义的变量 NSLog(@"c is %i", c); return a + b; };
NSLog(@"%i", sum(10, 10));
}
int main(int argc, const char * argv[]) {
@autoreleasepool { // test2();
Button *btn = [[[Button alloc] init] autorelease];
btn.block = ^(Button *btn){ NSLog(@"按钮-%@被点击了", btn); };
//模拟按钮点击 [btn click]; } return 0; }
|
Button.h
// // Button.h // OC10-内存管理2-set方法的内存管理 // // Created by qwz on 13-12-10. // Copyright (c) 2013年 renhe. All rights reserved. //
#import <Foundation/Foundation.h>
@classButton;
typedef void (^ButtonBlock) (Button *);
@interface Button : NSObject
@property (nonatomic, assign) ButtonBlock block;
//模拟按钮点击 - (void)click;
@end
|
Button.m
// // Button.m // OC10-内存管理2-set方法的内存管理 // // Created by qwz on 13-12-10. // Copyright (c) 2013年 renhe. All rights reserved. //
#import "Button.h"
@implementation Button - (void)click{ _block(self); }
@end |