Hãy xem xét các đoạn mã sau:Blocks, vòng lặp và biến cục bộ
for(/* some condition */) {
int x = rand();
[array addObject:^(){
NSLog(@"%d", x);
}]
}
for(void (^block)() in array) {
block();
}
Bây giờ tôi mong chờ đoạn mã này để in ra tất cả các giá trị được gán cho x ở chỗ cho vòng lặp; tuy nhiên có vẻ như tất cả các khối chia sẻ cùng một biến 'x' (có lẽ là biến cuối cùng).
Bất kỳ ý tưởng nào tại sao điều này là như vậy và cách tôi có thể sửa mã để mỗi khối chứa biến 'x' như lúc đó khối đã được xác định?
Tôi vẫn tự học hỏi về bản thân nhưng một điều kỳ lạ xuất hiện trong đầu. Khi bạn addObject :, mảng sẽ mặc định giữ lại đối tượng khối. Tuy nhiên, khối đối tượng được đặt trên ngăn xếp khi chúng được khai báo để nó có vẻ như ở đây họ sẽ ngay lập tức rơi ra khỏi phạm vi. Block_Copy sẽ di chuyển khối đến heap mà có vẻ như điều phải làm. –