__strong typeof(self) strongself = weakself

//创建ViewController控制器
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

#import "ViewController.h"
#import "AController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 40)];
    [btn setTitle:@"ViewController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor blueColor];
    [btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}

-(void)clickBtn:(UIButton *)sender{
    
    AController *avc = [[AController alloc] init];
    [self.navigationController pushViewController:avc animated:YES];
    
}
@end


//创建 AController
#import <UIKit/UIKit.h>
@interface AController : UIViewController

@end

#import "AController.h"
#import "BViewController.h"
@interface AController ()

@end

@implementation AController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 40)];
    [btn setTitle:@"AController" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor redColor];
    [btn addTarget:self action:@selector(pushToBController:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    UIButton *pop = [[UIButton alloc] initWithFrame:CGRectMake(100, 260, 100, 40)];
    [pop setTitle:@"popToRotViewController" forState:UIControlStateNormal];
    pop.backgroundColor = [UIColor orangeColor];
    [pop addTarget:self action:@selector(popToViewController:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:pop];

}

-(void)pushToBController:(UIButton *)sender{
    
    BViewController *bvc = [[BViewController alloc] init];
    __weak typeof(self) weakself = self;
    [bvc youWenTi:^(NSString *name) {
        __strong typeof(self) strongself = weakself;
        NSLog(@"%@",name);
        [strongself doSomething];
        [strongself otherAnthing];
    }];
    
    NSLog(@"block地址---%p",bvc.block);
    [self performSelector:@selector(pushViewController:) withObject:bvc afterDelay:4];
}

-(void)popToViewController:(UIButton *)sender{
    
    [self.navigationController popViewControllerAnimated:YES];
    
}
-(void)pushViewController:(BViewController *)bvc{

       NSLog(@"5秒时间到");
      if (self) [self.navigationController pushViewController:bvc animated:YES];
}

-(void)doSomething{
    
    NSLog(@"doSomething");

    
}
-(void)otherAnthing{
    
    NSLog(@"otherAnthing");

};
-(void)dealloc{

    NSLog(@"A已经销毁");

}
@end

//创建BViewController控制器
#import <UIKit/UIKit.h>

typedef void(^PushBlock)(NSString *name);
@interface BViewController : UIViewController

@property (nonatomic,copy) PushBlock block;
-(void)youWenTi:(PushBlock)block;

@end

#import "BViewController.h"
#import "AController.h"
@interface BViewController ()

@end

@implementation BViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
}

-(void)youWenTi:(PushBlock)block{
    
    NSLog(@"我是 B 控制器");
    self.block = block;
    [self performSelector:@selector(implementBlock) withObject:nil afterDelay:8];
}

-(void)implementBlock{

    if (self.block) {
        self.block (@"block执行");
    }
}

-(void)popToAController{
    
    [self.navigationController popViewControllerAnimated:YES];
}

-(void)dealloc{
    
    NSLog(@"B已经销毁");
}

@end


作为一名合格的程序员,写的每一句代码都该知道什么意思,网上有好多对这两种写法的争议,说第一种写法最规范,说第一种写法能保证在 block 执行之前self不被释放或是还有人说什么能保证一些不可估计的错误,对于这种模棱两可的说法,我真想抽他;经我粗浅的论证,并没有什么不同,所以我觉得第一种写法纯属多余,欢迎讨论,QQ号:739136841

    __weak typeof(self) weakself =self;

    [bvc youWenTi:^(NSString *name) {

        __strong typeof(self) strongself = weakself;

        NSLog(@"%@",name);

        [strongself doSomething];

        [strongself otherAnthing];

    }];

    __weak typeof(self) weakself =self;

    [bvc youWenTi:^(NSString *name) {

//        __strong typeof(self) strongself = weakself;

        NSLog(@"%@",name);

        [weakself doSomething];

        [weakself otherAnthing];

    }];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值