您的位置:首页 > 移动开发 > IOS开发

ios-block回调

2015-07-07 13:21 369 查看
1、block是什么?block是一个特殊的OC对象,它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量.

默认情况下block使用到的局部变量都会被复制,而不是保留.
所以它无法改变局部变量的值.
如果在变量面前加上__block, 那么编译器回去不会复制变量, 而是去找变量的地址, 通过地址来访问变量, 实际上就是直接操作变量.
另外块是在栈上分配的, 所以一旦离开作用域, 就会释放, 因此如果你要把快用在别的地方, 必须要复制一份.
所以在属性定义一个快的时候需要使用copy: @property (nonatomic, copy) void (^onTextEntered)(NSString *enteredText);
块是不能保留的, retain对块没有意义.
2、block能干什么?
block可以实现一件事干完之后,再去干另一件事
block可以自定义另一件事
#import "ViewController.h"

typedef void(^done1)(NSString *message);

typedef int(^done2)(NSString *message);

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

// [self loadHttpRequest:^(NSString *message)

// {

// NSLog(@"在控件上显示配置数据:%@",message);

// }];

//

// [self loadHttpRequest_1:^int(NSString *message) {

// NSLog(@"%d",(int)[message integerValue]);

//

// return (int)[message integerValue];

//

// }];

[self loadHttpRequest:^(NSString *message) {

NSLog(@"在控件上显示配置数据:%@",message);

}];

[self loadHttpRequest1:^int(NSString *message) {

NSLog(@"%d",(int)[message integerValue]);

return (int)[message integerValue];

}];

}

//省略block名字

//- (void)loadHttpRequest:(void(^)(NSString *message))completion

//{

// //假设加载出来的数据

// NSString *data = @"1";

// //回调,去配置数据

// completion(data);

//}

//省略block名字

//- (void)loadHttpRequest_1:(int(^)(NSString *message))completion

//{

// //假设加载出来的数据

// NSString *data = @"1";

// //回调,去配置数据

// completion(data);

//}

//定义block名字

- (void)loadHttpRequest:(done1)completion

{

//假设加载出来的数据

NSString *data = @"1";

//回调,去配置数据

completion(data);

}

//定义block名字

- (void)loadHttpRequest1:(done2)completion

{

//假设加载出来的数据

NSString *data = @"1";

//回调,去配置数据

completion(data);

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: