一张图看懂block使用不当造成内存泄露

本文详细解析了Objective-C中Block的本质、转换原理,并揭示了两个常见陷阱,帮助开发者避免潜在的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
//  main.m
//  01-block原理
//
//  Created by 杨俊飞 on 15/6/4.
//  Copyright (c) 2015年 杨俊飞. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Student.h"

/**
 
 
 1> block 的本质:指向结构体的指针
 
 2> 使用命令: clang -rewrite-objc main.m 可以把OC代码转成 CPP代码
 然后查看转化后的C代码、分析block 的原理。
 
 */

int b = 20;

void test1(){
    __block int a = 10;
    void (^b1)() = ^{
        a = 20;
        b = 30;
    };
    NSLog(@"%d",a);
    NSLog(@"%d",b);
    b1();
    NSLog(@"%d",a);
    NSLog(@"%d",b);
}

/** block 陷阱1  */

void test2(){
    Student * s1 = [[Student alloc] init];
    s1.copy_block = ^{
        NSLog(@"block run---");
        s1.age =10; //该行代码会导致 s1 无法释放、导致内存泄漏
    };
    s1.copy_block();
}

void test3(){
    Student * s1 = [[Student alloc] init];
    __unsafe_unretained Student * s2 = s1;  // <==>   __weak Student * s2 = s1;
    s1.copy_block = ^{
        NSLog(@"block run---");
        s2.age = 10;
    };
    s1.copy_block();
}

/** block 陷阱2  */
void test4(){
    /** block 默认是在栈内存中 copy以后就会新生成一份放在堆内存中          */
    
    void (^myblock)() = ^{
        NSLog(@"-----");
    };
    [myblock copy];// <==> Block_copy(myblock);
    
}
void test5(){
    Student * s1 = [[Student alloc] init];
    s1.assign_block = ^{
        NSLog(@"block run---");
        s1.age =10;
    };
    s1.assign_block();
}
int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        
        //        test1();
        //        test2();
        //        test3();
        //        test4();
        test5();
        
        
        
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值