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
默认情况下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
相关文章推荐
- iOS接入支付宝(支付功能)
- 宏定义的黑魔法 - 宏菜鸟起飞手册
- nagiosgraph安装步骤
- 10步成为专业iOS开发者——新手向,从零起步
- 让自己的创意随时随地在纸上实现出来
- iOS 8 AutoLayout 及SizeClass(三) 使用详解 好多值得学习及研究的地方
- ios 字典转模型
- ios学习8_KVC和字典转模型
- ios学习8_KVC和字典转模型
- iOS 8 AutoLayout 及SizeClass(二) 使用详解
- iOS 编程 计算字符串文字宽度
- 用CocoaPods做iOS程序的依赖管理
- iOS AutoLayout 及SizeClass 自动布局(一)
- ios学习笔记:ios如何选择delegate ,notification,kvo
- iOS8 Xcode6的新特性
- ios 上传文件
- iOS开发自定义时间选取器
- Xcode 5 + iOS 7免证书(iDP)真机调试与生成IPA全攻略
- 跨平台移动开发实战(二)------IOS开发环境搭建
- XCode6的iOS Simulator 文件保存位置