2-1ReactiveCocoa详解_RAC初识-Block简单使用

Block简单使用

三种使用方式:

1:block作为对象的属性;
2:block作为方法的参数;
3:block作为返回值!!!(扩展非常强!!).

1.block作为对象的属性

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic,strong)Person *p;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //1.block  作为对象的属性
    Person *p = [[Person alloc] init];
  
    //block ---直接输入inlineBlock就可以自动弹出block块
    void(^LQBlock)() = ^() {
        NSLog(@"block");
    };
    //调用
    p.block = LQBlock;
    _p = p;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.p.block();
}
@end
#import <Foundation/Foundation.h>

@interface Person : NSObject
/*block : ARC使用strong,非ARC copy */
@property (nonatomic,strong) void(^block)();
@end

2.block作为方法的参数

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic,strong)Person *p;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self block2];
 
}
- (void)block2{
    //2.block作为方法的参数!!
    Person *p = [[Person alloc] init];
    [p eat:^(NSString * s){
        NSLog(@"爱吃%@",s);
    }];
}
#import <Foundation/Foundation.h>

@interface Person : NSObject
/*block : ARC使用strong,非ARC copy */
@property (nonatomic,strong) void(^block)();

//无参数block
//-(void)eat:(void(^)())block;
//有参数block
-(void)eat:(void (^)(NSString *))block;
@end

#import "Person.h"

@implementation Person
//无参数block
//-(void)eat:(void (^)())block{
//    block();
//}

//有参数block
-(void)eat:(void (^)(NSString *))block{
    
    block();
    
}
@end

//3.block作为返回值!!!(扩展非常强!!)

//只要有返回值就能够使用对象来点出对应方法(无带形参)的返回值(即:p.run(12)使用点语法进行点出对应方法的返回值)

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()
/**  */
@property(strong ,nonatomic)Person * p;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.block作为对象的属性!!
    //2.block作为方法的参数!!
    //3.block作为返回值!!!(扩展非常强!!)
    Person * p = [[Person alloc]init];
    p.run(100);
    
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void(^)(int))run;
@end
#import "Person.h"
@implementation Person
-(void (^)(int))run
{
    return ^(int m){
        NSLog(@"哥么跑起来了!!跑了%d",m);
    };
}
@end

注意事项:

iOS警告-This block declaration is not a prototype

关于警告

我们定义一个不带参数的block,通常是如下的方式

typedefvoid (^UpdateSwichBtnBlock)();

在xcode9中会提示一个警告

This block declaration is not a prototype
Insert ‘void'

解决方式可以是如下的几种

typedefvoid (^UpdateSwichBtnBlock)(void);

但是这样,很多第三方要改,涉及的面太大了,目前可能不太适合,虽然这个是趋势.

或者,如果只是很少的地方,也可以使用

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"
typedefvoid (^UpdateSwichBtnBlock)();
#pragma clang diagnostic pop

彻底的暂时解决所有这种警告的方式
在工程的设置中

11111.png

设置为NO,则这些警告就消失了

不过这不是一种好习惯,只是暂时性的不让提示这种类型的警告而已

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,026评论 6 13
  • 1 Block机制 (Very Good) Block技巧与底层解析 //www.greatytc.com...
    Kevin_Junbaozi阅读 9,502评论 3 48
  • 昨夜熬夜看扶摇,感觉着实没睡好 不知人为何这般,明明一直跳看,却还是要坚持看完已经很新了的
    戴马戴马阅读 1,058评论 0 0
  • 非常幸运的事,是我来到了深圳这座繁华的城市。从此我认识了很多热爱运动,跑步,登山,越野,骑行等各种爱好的人。所以咱...
    易拉罐_2756阅读 2,972评论 0 0

友情链接更多精彩内容