美文网首页iOS Developer
oc block 防止 strong capture需要这么写?

oc block 防止 strong capture需要这么写?

作者: 2d899c5242bd | 来源:发表于2017-08-05 23:37 被阅读57次

afnetworking 中曾有这样一段代码,是维护者防止block强持有 task对象做的修改

__weak __typeof__(task) weakTask = task;
[self.uploadProgress setCancellationHandler:^{
        __typeof__(weakTask) strongTask = weakTask;
        [strongTask cancel];
    }];

这里叫个真,想知道block中是否__typeof__(task) strongTask = weakTask;会导致task 被强持有,于是做了如下测试:
测试类

#import <Foundation/Foundation.h>

@interface BlockClass : NSObject
@property (nonatomic,copy) void (^blockName)();
@end
#import "BlockClass.h"

@implementation BlockClass

- (void)dealloc
{
    NSLog(@"%s", __FUNCTION__);
}

@end

test case模拟 client

#import <XCTest/XCTest.h>
#import "BlockClass.h"

@interface BlockClassTests : XCTestCase
@property (nonatomic,strong) BlockClass *blockObj;
@end

@implementation BlockClassTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
     BlockClass *blockObj = [[BlockClass alloc] init];
    __weak typeof(blockObj) weakObj = blockObj;
    blockObj.blockName = ^{
        __strong typeof(blockObj) strongObj = weakObj;
//        id obj = blockObj;//我是注释 2
    };
    self.blockObj = blockObj;
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
    self.blockObj = nil;
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    XCTAssertTrue(self.blockObj.blockName != nil);
}

@end

查证,控制台会输出

2017-08-05 16:57:09.345 OperationQueueTest[26460:10245855] -[BlockClass dealloc]

倘若将注释2 打开,则会导致强持有了。

我的结论是

block中写__typeof__(task) strongTask = weakTask;不会导致task 被强持有。如有问题还望指正。

相关文章

  • oc block 防止 strong capture需要这么写?

    afnetworking 中曾有这样一段代码,是维护者防止block强持有 task对象做的修改 这里叫个真,想知...

  • iOS 之 block的 Weak-Strong-Dance

    先看看我看sdwebimage的时候,作者写block的时候对Weak-Strong-Dance的应用吧。 防止循...

  • weakSelf 写法(OC+Swift)

    经常用Block传值,所以我们经常反复为了防止循环引用而去这样写: OC: 宏定义: #define WEAKSE...

  • iOS学习笔记之@property

    strong: 除NSString\block以外的OC对象 weak:各种UI控件(但不是绝对,也有控件要使用s...

  • iOS 中的内存管理优化

    闭包 外面将强引用对象转化为弱引用指针,防止循环引用 block内弱引用转换成strong强引用指针,防止多线程和...

  • 关于block--你想了解的几乎都在这里了

    一.block定义二.block的本质三.block变量捕获(Capture)四.block的类型五.block的...

  • iOS_Block

    block的本质其实就是OC对象, Block是oc的一段代码块,在需要的时候调用。 Block变量的声明格式为:...

  • OC中block底层原理总结(下)

    关于OC中block的本质结构、block的变量捕获方式请查看OC中block底层原理总结(上)需要先看懂上篇文章...

  • Auspicious Sprout

    Capture epic mythical beasts, get super-strong beasts, en...

  • Block

    Block的变量捕获(capture) Block的类型 如何区分Block的类型 MRC:Global:没有访问...

网友评论

    本文标题:oc block 防止 strong capture需要这么写?

    本文链接:https://www.haomeiwen.com/subject/oaqwlxtx.html