Objective-C中的block使用方式

创建了一个Person类作为测试用。

Person.h

#import <Foundation/Foundation.h>
typedef void(^blki)();
typedef int(^blkia)(int, int);
@interface Person : NSObject
@property (nonatomic,copy) void(^blkname)(void);
-(void)eat:(void(^)())blknameb;
-(void)walk:(int(^)(int,int))blkwalk;
-(void)beat:(blki)bi;
-(int)beata:(blkia)bia;

@end

Person.m

#import "Person.h"

@implementation Person
//-(void)eat:(void(^)(void))blockName{
//    
//    myBlock();
//}



-(void)eat:(void(^)())blknameb{
    blknameb();
    NSLog(@"This is a Person's class");
}

-(void)walk:(int(^)(int,int))blkwalk{
    int ld = 0;
    ld = blkwalk(3,4);
    NSLog(@"The person's speed is %d", ld);
    NSLog(@"Is this ok?");
}
-(void)beat:(blki)bi {
    bi();
    NSLog(@"Here is set for block M");
}
-(int)beata:(blkia)bia{
    int beataa = bia(33,2);
    return beataa;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"

声明一个blocka变量
//void(^blocka)(void);
声明一个blockb变量-
//int(^blockb)(int num1,int num2);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
//blocka - 定义并初始化一个block
        void(^blocka)(void) = ^void(){
            NSLog(@"This is block a");
        };
        
        blocka();
        
//blockb -不省略返回值 -返回一个整数
    int(^blockb)(int,int) = ^int(int num1, int num2){
            int sum = 0;
            sum = num1 + num2;
            return sum;
        };
      NSLog(@"The Block b is %d", blockb(2,4));
        
//blockc - 不省略返回值-返回一个字符串- 无参数
        NSString*(^blockc)(void) = ^NSString*(){
            NSString *blockcStr = @"This is block c";
            return blockcStr;
        };
        
        NSLog(@"%@", blockc());
        
//blockd - 省略返回值 -整数
        int(^blockd)(int,int) = ^(int inputa, int inputb){
            return inputa * inputb;
        };
        
        NSLog(@"THe block d is %d", blockd(4,5));

//blocke - 省略返回值 -字符串 - 带参数
        NSString*(^blocke)(NSString *) = ^NSString*(NSString *abc){
            
            NSString *blke = @"This is blocke";
            NSString *newblke =  [blke stringByAppendingString:abc];
            return newblke;
        };
        NSLog(@"%@",blocke(@" Great"));
        
//blockf typedef 一个block 别名,作为一个数据类型使用
        //先定义一种block的数据类型
        typedef int(^blockf)(int,int);
        //基于这个类型创建一个block 对象fsum
        blockf fsum = ^(int valuea, int valueb){
            return valuea + valueb;
        };
        NSLog(@"Block F is %d",fsum(45,30));
        
//blockg 整数返回整数 -输入inline 下面的block自动显现 block 标准格式
//        <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//            <#statements#>
//        };
        
        int(^blockg)(int) = ^(int gum) {
            return gum * gum * gum;
        };
        
        NSLog(@"Block g is %d", blockg(20));
      
//blockh 等价于 block i 如下
        //声明
        int(^blockh)(int valueh);
        //定义blockh
        blockh = ^(int valueh) {
            return valueh + 2;
        };
        //使用blockh
        NSLog(@"Block H is %d", blockh(3));
     //----------------------//
        //声明和定义blocki
        int(^blocki)(int) = ^(int valuei){
            return valuei + 2;
        };
        //使用blocki
        NSLog(@"Block I is %d", blocki(3));
        
//blockj check blockj and blockj()
        void(^blockj)(void) = ^(void){
            NSLog(@"This is block J");
        };
        //这是一个指针地址
        NSLog(@"Block j is : %@", blockj);
        
       //类似函数被调用了一次
        blockj();
        
//blockk can be used as a parmeter in a function

        //定义和声明一个block k
        void(^blockk)(void) = ^(){
            NSLog(@"This is block K");
        };
        //实例化一个对象Person
        Person *tom = [[Person alloc] init];
        //将block k 作为一个参数传递给 Person (tom) 的 eat方法
        [tom eat:blockk];

        //定义和声明一个带参数的 block l
        int(^blockl)(int, int) = ^(int la, int lb) {
            int lc = 0;
            lc = la + lb;
            NSLog(@"Block L's value is %d", lc);
            return lc;
        };
        [tom walk:blockl];
        
        //定义和声明一个使用typedef的block
        void(^blockm)() = ^(){
            NSLog(@"This is block I is a typedef");
        };
        [tom beat:blockm];
        
        //定义使用一个typedef 带整数的block
        int(^blockn)(int,int) = ^(int na, int nb) {
            return na * nb;
        };
        
        int nnum = [tom beata:blockn];
        NSLog(@"The block N is %d", nnum);
        
    }
    return 0;
}


Log:

2018-03-17 14:00:29.244955+0800 TOCBlockb[21570:1408250] This is block a
2018-03-17 14:00:29.245203+0800 TOCBlockb[21570:1408250] The Block b is 6
2018-03-17 14:00:29.245263+0800 TOCBlockb[21570:1408250] This is block c
2018-03-17 14:00:29.245282+0800 TOCBlockb[21570:1408250] THe block d is 20
2018-03-17 14:00:29.245379+0800 TOCBlockb[21570:1408250] This is blocke Great
2018-03-17 14:00:29.245401+0800 TOCBlockb[21570:1408250] Block F is 75
2018-03-17 14:00:29.245412+0800 TOCBlockb[21570:1408250] Block g is 8000
2018-03-17 14:00:29.245420+0800 TOCBlockb[21570:1408250] Block H is 5
2018-03-17 14:00:29.245428+0800 TOCBlockb[21570:1408250] Block I is 5
2018-03-17 14:00:29.245492+0800 TOCBlockb[21570:1408250] Block j is : <__NSGlobalBlock__: 0x1000022d8>
2018-03-17 14:00:29.245511+0800 TOCBlockb[21570:1408250] This is block J
2018-03-17 14:00:29.245544+0800 TOCBlockb[21570:1408250] This is block K
2018-03-17 14:00:29.245558+0800 TOCBlockb[21570:1408250] This is a Person's class
2018-03-17 14:00:29.245573+0800 TOCBlockb[21570:1408250] Block L's value is 7
2018-03-17 14:00:29.245588+0800 TOCBlockb[21570:1408250] The person's speed is 7
2018-03-17 14:00:29.245600+0800 TOCBlockb[21570:1408250] Is this ok?
2018-03-17 14:00:29.245613+0800 TOCBlockb[21570:1408250] This is block I is a typedef
2018-03-17 14:00:29.245624+0800 TOCBlockb[21570:1408250] Here is set for block M
2018-03-17 14:00:29.245637+0800 TOCBlockb[21570:1408250] The block N is 66
Program ended with exit code: 0


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值