block总结

1block属性保存

.h文件中定义属性

//模型中触发时做的事情

@property (nonatomic, strong) void(^block)();


controller中引入模型.h文件

 // 创建模型

    Model *item1 = [Model itemWithTitle:@"打电话"];

    item1.block = ^{

        NSLog(@“要做的事情”);

    };

若有多个Model存入数组区分不同的Model

在按钮或其表格点击事件中触发block

 // 把要做的事情(代码)保存到模型


    Model *item = self.items[indexPath.row];

    

    if (item.block) {

        item.block();

    }


2block取代delegate反向传值

对比delegate:

FirstController中跳入SecondController并反向传值


SecondController.h中语法

@class SecondController;

@protocol SecondControllerDelegate <NSObject>


@optional

// 设计方法:想要代理做的事情

- (void)modalViewController:(SecondController *)modalVc sendValue:(NSString *)value;

@end


@interface SecondController : UIViewController


@property (nonatomic, weak) id<SecondControllerDelegate> delegate;

@end

SecondController.m中点击事件触发delegte方法

 // 传值给FirstController

    if ([_delegate respondsToSelector:@selector(modalViewController:sendValue:)]) {

        [_delegate modalViewController:self sendValue:@"123"];

    }

FirstController.m遵守协议ModalViewControllerDelegate


 modalVc.delegate = self;

#pragma mark - ModalViewControllerDelegate

// 传值给ViewController

- (void)modalViewController:(ModalViewController *)modalVc sendValue:(NSString *)value

{

    NSLog(@"%@",value);

}


使用block

SecondController.h中添加block属性:

@property (nonatomic, strong) void(^block)(NSString *value);

SecondController.m中点击时间触发

if (_block) {

        _block(@"123");

    }

FirstController.m中引用block实现反向传值:

SecondController *Vc = [[SecondController alloc] init];


    Vc.block = ^(NSString *value) {

      

        NSLog(@"%@",value);

    };


 block是一个对象

    判断当前文件是MRC,还是ARC

    1.dealloc 能否调用super,只有MRC才能调用super

    2.能否使用retain,release.如果能用就是MRC

 

    ARC管理原则:只要一个对象没有被强指针修饰就会被销毁,默认局部变量对象都是强指针,存放到堆里面

 

    MRC开发常识:1.MRC没有strong,weak,局部变量对象就是相当于基本数据类型

   2.MRC给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋值

 

    总结:只要block没有引用外部局部变量,block放在全局区

 

    MRC:管理block只要Block引用外部局部变量,block放在栈里面.block只能使用copy,不能使用retain,使用retain,block还是在栈里面

    ARC:管理block 只要block引用外部局部变量,block放在堆里面block使用strong.最好不要使用copy


block造成循环利用:Block会对里面所有强指针变量都强引用一

使用修饰符__weak typeof(self) weakSelf = self;避免循环引用


方法中使用带返回值参数的block

Function.h

@property (nonatomic, assign) NSInteger result;

- (void)cacultor:(NSInteger(^)(NSInteger result))cacultorBlock;


Function.m

- (void)cacultor:(NSInteger (^)(NSInteger))cacultorBlock

    if (cacultorBlock) {

      _result =  cacultorBlock(_result);

    }


文件中使用Function.h

 // 创建方法管理者

    Function *mgr = [[Function alloc] init];

    [mgr cacultor:^(NSInteger result){

        result += 5;

        result += 6;

        result *= 2;

        return result;

    }];   

    NSLog(@"%ld",mgr.result);


block返回值链式编程

@property (nonatomic, assign) int result;

- (Function *(^)(int))add;


- (Function *(^)(int))add

{

    return ^(int value){

        _result += value;

        

        return self;

    };

}


文件中引用:

 Function *mgr = [[Function alloc] init];    

    mgr.add(5).add(5).add(5).add(5); 

    NSLog(@"%d",mgr.result);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值