自学iOS开发系列----OC(block)

1.block:块语法,是一种新的语法结构。学习的时候可以类比于函数指针。

2.block和函数指针对比

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

//声明函数
int add(int,int);

int main(int argc, char * argv[]) {
    @autoreleasepool {

        //函数名表示函数的入口地址
        int (*p)(int,int) = add;
        int num = p(3,5);
        NSLog(@"%d",num);

        //声明一个block,就如同把函数指针的*换成^
        int (^block)(int,int);
        //实现这个block
        block = ^(int a,int b){
            return a+b;
        };
        NSLog(@"%d",block(3,6));

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

//实现函数
int add(int a,int b) {
    return a + b;
}

3.block声明和实现写在一起

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        /*
         *  ^是块语法符号,变量名是voidBlock
         *  声明格式:返回值类型(^块变量)(参数类型1,参数类型2...)
         *  实现格式:^(参数类型1,参数类型2...)
         */
        void (^voidBlock)(void) = ^(void){
            NSLog(@"将block的声明和实现写在一起");
        };
        voidBlock();

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

4.__block关键字

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        //块语法中能够访问到变量,但是变量无法被更改,如果想在块语法中更改捕获的变量,需要加__block关键字修饰
        __block int number = 5;
        void (^changeVar)(int) = ^(int a){
            number = a;
        };
        changeVar(15);
        NSLog(@"%d",number);

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

5.block传值
①创建Supermarket类
Supermarket.h

#import <Foundation/Foundation.h>

@interface Supermarket : NSObject

@property (nonatomic, copy) void(^byValueBlock)(NSString *);

- (void)begin;
- (void)finish;

@end

Supermarket.m

#import "Supermarket.h"

@implementation Supermarket

- (void)begin {
    sleep(2);
    [self finish];
}

-(void)finish {
    self.byValueBlock(@"500元整");
}

@end

②创建Student类
Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject

- (void)buy;

@end

Student.m

#import "Student.h"
#import "Supermarket.h"

@implementation Student

-(void)buy {
    Supermarket *supermarket = [[Supermarket alloc] init];
    NSLog(@"我购买的东西多少钱?");
    supermarket.byValueBlock = ^(NSString *str){
        NSLog(@"%@",str);
    };
    [supermarket begin];
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Student.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        Student *student = [[Student alloc] init];
        [student buy];

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

6.block作为参数
①新建Market类
Market.h

#import <Foundation/Foundation.h>

typedef void (^marketBlock)(void);

@interface Market : NSObject

- (void)beginWithMoney:(marketBlock)block;

@end

Market.m

#import "Market.h"

@implementation Market

-(void)beginWithMoney:(marketBlock)block {
    NSLog(@"开始购物");
    sleep(2);
    NSLog(@"购物完成了");
    block();
}

@end

②创建Person类
Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)buy;

@end

Person.m

#import "Person.h"
#import "Market.h"

@implementation Person

-(void)buy {
    Market *market = [[Market alloc] init];
    [market beginWithMoney:^{
        NSLog(@"这次买衣服又花了500元");
    }];
}

@end

③main.m

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Person.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {

        Person *person = [[Person alloc] init];
        [person buy];

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值