block3

Block循環(huán)引用

typedef void (^blk_t)(void);

@interface JAXObject : NSObject {
    blk_t blk_;
}

@end

@implementation JAXObject

- (instancetype)init {
    if (self = [super init]) {

        blk_ = ^{
            NSLog(@"self = %@", self);
        };
        
    }
    return self;
}

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

@end

int main(int argc, const char * argv[]) {
    
    JAXObject *o = [[JAXObject alloc] init];
    NSLog(@"%@", o);
    
    return 0;
}

沒有調(diào)用dealloc
o 持有blk_
blk_持有o, __weak避免循環(huán)引用

@implementation JAXObject

- (instancetype)init {
    if (self = [super init]) {
        
        __weak JAXObject *weakSelf = self;
        blk_ = ^{
            NSLog(@"self = %@", weakSelf);
        };
        
    }
    return self;
}

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

@end

也可以用__Block 解除循環(huán),但必須要調(diào)用block。

@implementation JAXObject

- (instancetype)init {
    if (self = [super init]) {
        
        __block JAXObject *blockSelf = self;
        blk_ = ^{
            NSLog(@"self = %@", blockSelf);
            blockSelf = nil;
        };
        
    }
    return self;
}

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

- (void)exexblock {
    blk_();
}

@end

int main(int argc, const char * argv[]) {
    
    JAXObject *o = [[JAXObject alloc] init];
    [o exexblock];
    
    return 0;
}

執(zhí)行dealloc調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容