cari

Rumah  >  Soal Jawab  >  teks badan

objective-c - NSStackBlock 的内存的一个疑问

很常见的这个关于block 的题

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

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

Without ARC, the block is an NSStackBlock allocated on the stack of exampleB_addBlockToArray(...). By the time it executes in exampleB(), the the block is no longer valid, because that stack has been cleared.

解释只说明了原理。我有一个理解不知道对不对?
NSStackBlock 类似于一个栈“对象”,不像堆上的局部对象变量 在return 返回它,后所指的内容依然不会被释放。所以在函数结束后其实array 所存的对象(point)依然存在,只是所指的内存(内容)被释放掉了?

伊谢尔伦伊谢尔伦2758 hari yang lalu540

membalas semua(1)saya akan balas

  • 滿天的星座

    滿天的星座2017-05-02 09:21:15

    Cuba jawab, kerana saya tidak pasti tentang situasi bukan ARC, tetapi pemahaman saya sama seperti anda~

    Menurut penjelasannya, blok bukan ARC diletakkan pada timbunan dan bukannya timbunan, yang sama dengan jenis asas. Takrifan blok dalam exampleB_addBlockToArray ialah int b = 1; Apa yang disimpan dalam tatasusunan ialah penunjuk kepada b, iaitu alamatnya &b, iaitu seperti 0x1234567…….

    Tetapi b ialah exampleB_addBlockToArray pembolehubah setempat bagi fungsi ini. Jadi apabila fungsi ini tamat, memori yang digunakannya "dilepaskan". Malah, ia ditandakan sebagai "data telah dibuang dan memori ini boleh digunakan untuknya".

    Apabila dilaksanakan, penunjuk 0x1234567…… yang disimpan dalam tatasusunan masih ada, tetapi memori yang ditunjukkannya tidak lagi di bawah kawalan penunjuk ini. Mungkin data lain telah pun ditulis, atau mungkin masih ada data dari tadi.

    balas
    0
  • Batalbalas