OC底層 block內修改變數

2021-10-11 03:11:36 字數 540 閱讀 4361

講一下以上兩個問題:

對於捕獲問題, 只有區域性變數才能**獲, 全域性變數不需要捕獲,直接拿著使用, 但是有一點, 當block在棧中時, block是不能捕獲物件型變數, 直接拿著使用, 只有在堆中的block才能捕獲物件型變數;

對於block內部修改問題, 因為變數捕獲有兩種, 一種是值捕獲, 一種是位址捕獲, 對於這兩種捕獲, 第一種是不允許在block中修改其值, 第二種是不允許在block中修改其位址, 但是可以修改其值;對於物件型變數, 也是屬於位址捕獲, 不允許修改其位址, 但是可以修改物件的屬性等; 如果想要修改block內部捕獲的變數的值, 則需要使用__block修飾block內部使用的對應的外部變數, 使用__block修飾的變數, 編譯器會將auto變數包裝成乙個物件; 這時候, block內部捕獲的變數指向包裝的物件位址,, 包裝物件內部的變數直接為外部變數對應的型別, 如果是物件型別, 則該變數指向外部物件的位址, 如果是基礎型別, 則直接為對應的型別;

OC底層 block型別

block繼承自nsblock,nsblock繼承自nsobject 分為三種 怎麼樣建立三種block?void test void test 如下圖 呼叫了auto遍歷的block呼叫了copy時,就會生成 nsmallocblock型別的block,這是將放在棧中的block放進了堆記憶體中,...

block底層實現與變數捕獲

本文已經新增到 徹底弄懂oc 歡迎加入我的qq群 661461410,一起 ios底層原理。block的本質是什麼?你能講出來它的底層結構嗎?全域性變數會被block捕獲嗎?block會捕獲哪些變數?block又叫 塊,是oc語法中非常重要的乙個概念,我們先來看一下block的簡單使用。int ma...

如何在 block 中修改外部變數

lock 的目的是為了支援並行程式設計,對於普通的 local 變數,我們就不能在 block 裡面隨意修改 原因很簡單,block 可以被多個執行緒並行執行,會有問題的 而且如果你在 block 中修改普通的 local 變數,編譯器也會報錯。那麼該如何修改外部變數呢?有兩種辦法,第一種是可以修改...