ios-block回调

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

 

posted on 2015-07-07 13:21  rankilau  阅读(258)  评论(0编辑  收藏  举报

导航