//创建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];
}];