__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];

    }];

处理下面代码可能出现线程问题的情况- (void)shutterCamera { AVCaptureConnection *videoConnection = [self.ImageOutPut connectionWithMediaType:AVMediaTypeVideo]; UIDeviceOrientation curDeviceOrientation = [[UIDevice currentDevice] orientation]; if (!videoConnection || !self.session.isRunning) { ATLog(@"take photo failed!"); return; } AVCaptureVideoOrientation avcaptureOrientation = [self avOrientationForDeviceOrientation:curDeviceOrientation]; [videoConnection setVideoOrientation:avcaptureOrientation]; [videoConnection setVideoScaleAndCropFactor:self.effectiveScale]; MJWeakSelf; [self.ImageOutPut captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) return; if (imageDataSampleBuffer) { NSData * imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; strongSelf.image = [UIImage imageWithData:imageData]; if (strongSelf.image) { strongSelf.image = [UIImage updateImageSize:strongSelf.image]; } strongSelf.image = [[TZImageManager manager] fixOrientation:strongSelf.image];//[UIImage fixOrientation:weakSelf.image]; PHAuthorizationStatus authorStatus = [PHPhotoLibrary authorizationStatus]; if (authorStatus == PHAuthorizationStatusAuthorized) { [[TZImageManager manager] savePhotoWithImage:strongSelf.image completion:^(PHAsset *asset, NSError *error) { [strongSelf addPHAsset:asset]; }]; }else{ [strongSelf gotoEditImageController:strongSelf.image asset:nil]; } } }); }]; } - (void)gotoEditImageController:(UIImage *)image asset:(PHAsset *)asset { if (!image) { [ATMBPHud showErrorToView:self.view text:@"获取图片失败,请重新再试"]; return; } if (image) { image = [UIImage updateImageSize:image]; } YasicClipPage *vc = [[YasicClipPage alloc] init]; vc.userId = self.userId; vc.attention = self.attention; vc.targetImage = image; vc.searchType = self.searchType; vc.asset = asset; // [self stopSession]; dispatch_async(dispatch_get_main_queue(), ^{ [[KDUserInterfaceTool currenrtopViewController].navigationController pushViewController:vc animated:YES]; [self removeViewController:self]; }); } - (void)addPHAsset:(PHAsset *)asset { MJWeakSelf; TZAssetModel *assetModel = [[TZImageManager manager] createModelWithAsset:asset]; [ATHUD show]; [[TZImageManager manager] requestImageDataForAsset:assetModel.asset completion:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { [ATHUD dismiss]; UIImage *image = [UIImage imageWithData:imageData];//[[TZImageManager manager] fixOrientation:[UIImage imageWithData:imageData]]; image = [[TZImageManager manager] fixOrientation:image]; [weakSelf gotoEditImageController:image asset:asset]; } progressHandler:^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { ATLog(@"%f",progress); }]; } #pragma --mark 获取大图 - (void)getImageWithModel:(TZAssetModel *)model { if (model == nil) { ATLog(@"图片为空"); return; } [ATHUD show]; WS(weakSelf) [[TZImageManager manager] requestImageDataForAsset:model.asset completion:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { [ATHUD dismiss]; UIImage *image = [UIImage imageWithData:imageData]; if (weakSelf.downBtnClick) { weakSelf.downBtnClick(image, model); } } progressHandler:^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { ATLog(@"%f",progress); }]; }
最新发布
07-25
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值