検索

ホームページ  >  に質問  >  本文

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日前536

全員に返信(1)返信します

  • 滿天的星座

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

    非ARCの状況についてはよくわからないので、答えてみてください。しかし、私の理解はあなたと同じです〜

    その説明によると、非ARCブロックはヒープではなくスタックに配置され、これは基本タイプと同じです。 exampleB_addBlockToArray のブロックの定義は int b = 1; です。このように、配列に保存されるのは b へのポインタであり、そのアドレス &b、つまり、0x1234567... のようなものです。 exampleB_addBlockToArray里那个 block 的定义就是int b = 1;这样,保存在数组里的是指向 b 的指针,也就是它的地址&b,也就是一个0x1234567……这样的东西。

    但是 b 是exampleB_addBlockToArray这个函数的局部变量。所以在这个函数结束的时候,它用的那块儿内存就被『释放』掉了,实际上是标记为『数据已废弃,这块内存可以作为它用』了。

    等到执行的时候,数组里存的那个指针0x1234567……

    ただし、 b は関数 exampleB_addBlockToArray のローカル変数です。したがって、この関数が終了すると、使用していたメモリは「解放」され、実際には「データは破棄され、このメモリは使用できる」というマークが付けられます。 🎜 🎜実行すると、配列に格納されているポインタ 0x1234567... はまだ存在しますが、それが指すメモリはこのポインタによって制御されなくなります。すでに他のデータが書き込まれているか、先ほどのデータがまだ残っている可能性があります。 🎜

    返事
    0
  • キャンセル返事