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

来源:互联网 发布:microsoft画图软件 编辑:程序博客网 时间:2024/05/19 16:34

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]));    }}
0 0