objective-c - NSStackBlock 的記憶體的一個疑問
伊谢尔伦
伊谢尔伦 2017-05-02 09:19:15
0
1
569

很常見的這個關於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 id, has longo.

解釋只說明了原理。我有一個理解不知道對不對?
NSStackBlock 類似於一個棧“物件”,不像堆上的局部物件變數 在return 返回它,後所指的內容依然不會被釋放。所以在函數結束後其實array 所存的物件(point)依然存在,只是所指的記憶體(內容)被釋放掉了?

伊谢尔伦
伊谢尔伦

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

全部回覆(1)
滿天的星座

嘗試回答一下,因為我對非 ARC 的情況不太有把握,不過我的理解跟你是一樣的~

按照它的解釋,非 ARC 的 block 是放在堆疊上而不是堆上的,那就是跟基礎型別一樣。在exampleB_addBlockToArray里那个 block 的定义就是int b = 1;这样,保存在数组里的是指向 b 的指针,也就是它的地址&b,也就是一个0x1234567……這樣的東西。

但是 b 是exampleB_addBlockToArray這個函數的局部變數。所以在這個函數結束的時候,它用的那塊兒記憶體就被『釋放』掉了,實際上是標記為『資料已廢棄,這塊記憶體可以當作它』了。

等到執行的時候,陣列裡存的那個指標0x1234567……還在,但是它指的那塊記憶體早就不歸這個指標管了。有可能是已經寫上了別的數據,也有可能還殘留剛才的數據。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板