很常見的這個關於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();
}
NSStackBlock 類似於一個棧“物件”,不像堆上的局部物件變數 在return 返回它,後所指的內容依然不會被釋放。所以在函數結束後其實array 所存的物件(point)依然存在,只是所指的記憶體(內容)被釋放掉了?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.
解釋只說明了原理。我有一個理解不知道對不對?
嘗試回答一下,因為我對非 ARC 的情況不太有把握,不過我的理解跟你是一樣的~
按照它的解釋,非 ARC 的 block 是放在堆疊上而不是堆上的,那就是跟基礎型別一樣。在
exampleB_addBlockToArray
里那个 block 的定义就是int b = 1;
这样,保存在数组里的是指向 b 的指针,也就是它的地址&b
,也就是一个0x1234567……
這樣的東西。但是 b 是
exampleB_addBlockToArray
這個函數的局部變數。所以在這個函數結束的時候,它用的那塊兒記憶體就被『釋放』掉了,實際上是標記為『資料已廢棄,這塊記憶體可以當作它』了。等到執行的時候,陣列裡存的那個指標
0x1234567……
還在,但是它指的那塊記憶體早就不歸這個指標管了。有可能是已經寫上了別的數據,也有可能還殘留剛才的數據。