gpt4 book ai didi

ios - 在MRC中阻止为什么此代码不会崩溃

转载 作者:行者123 更新时间:2023-12-01 18:47:54 25 4
gpt4 key购买 nike

文件Person.h

@interface Person:NSObject
+ (void)callBlock:(void (^)())block;
@end

文件人
@imp:
+ (void)callBlock:(void (^)())block
{
[NSThread sleepForTimeInterval:2];
block();
}
@end

ViewDidLoad中的代码:
Person *p = [[Person alloc] init];
void (^block)() = ^{
NSLog(@"%@",p);
[p release];
}
[Person callBlock:block];

完!

我的问题:

在主函数
  • 中,块var是一个堆栈块,该块分配给函数+ callBlock :,而Person.m中的块也是一个堆栈块。它们的内容是相同的。
  • 我认为,在Person.m中调用main之前,系统中的main块将被释放,因此我认为该程序将崩溃,但运行正常。为什么?
  • 而且我认为我的代码与以下相同。

  • ...
     void example_addBlockToArray(NSMutableArray *array) {
    char b = 'B';
    [array addObject:^{
    printf("%cn", b);
    }];
    }

    void example() {
    NSMutableArray *array = [NSMutableArray array];
    example_addBlockToArray(array);
    void (^block)() = [array objectAtIndex:0];
    block();
    }

    这个程序崩溃了!它们之间有什么区别?

    抱歉!两个程序都使用mrc!我没有写清楚!

    最佳答案

    看来,您正在使用手动内存管理。

    因此是一个解释:

    人员对象案例

  • 您创建对象
  • 您创建块
  • 您调用块
  • 块将对象注销
  • 块释放对象
    这就是为什么没有崩溃

  • 字符日志案例

    由于您没有使用ARC,因此它是这样的:
  • 您添加了记录char的块
  • 离开将块添加到数组的函数后,刚创建的char 将从内存中释放。
    如果您使用ARC进行内存管理,它将在内存中保留此字符,直到该块存在。但是,一旦将其从数组中删除并且块的引用计数等于0,该字符也会被释放。
  • 您从数组
  • 中获取一个块
  • 调用它,它引用已经释放的char的内存地址,出现崩溃。如您的错误所述:
    EXC_BAD_ACCESS(代码= 1,地址= 0x0)
    意味着您指向零地址(换句话说,空指针异常)。

  • 就是这样了。

    关于ios - 在MRC中阻止为什么此代码不会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520554/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com