objective-c - NSStackBlock 的内存的一个疑问
伊谢尔伦
伊谢尔伦 2017-05-02 09:19:15
0
1
587

很常见的这个关于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)依然存在,只是所指的内存(内容)被释放掉了?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(1)
滿天的星座

非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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート