block 本質上也是乙個 oc 物件,它內部也有個 isa 指標
block 是封裝了函式呼叫以及函式呼叫環境的 oc 物件
block 的底層結構如下圖所示
原始碼解析:
struct __gsblock__load_block_impl_0
};
****************************************
① __block_impl:
struct __block_impl
;
****************************************
② __gsblock__load_block_desc_0:// 描述block
static
struct __gsblock__load_block_desc_0
__gsblock__load_block_func_0:
// block**塊內的函式
static
void
__gsblock__load_block_func_0
(struct __gsblock__load_block_impl_0 *__cself,
int a,
int b)
];
static dispatch_once_t oncetoken;
dispatch_once
(&oncetoken,^)
;dispatch_after
(dispatch_time
(dispatch_time_now,
(int64_t)
(1.0
* nsec_per_sec)),
dispatch_get_main_queue()
,^);
物件型別的 auto 變數
棧空間中的 block 是不會去持有外部物件的,如果是堆空間中的 block 是可以持有外部物件的。
__weak 問題解決
在使用 clang 轉換 oc 為 c++**時,可能會遇到一下問題:
cannot create __weak reference in file using manual reference
解決方案:支援arc、指定執行時系統版本,比如:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m
如果 block 被拷貝到堆上
如果 block 從堆上移除
copy 函式 與 dispose 函式的呼叫時機
mrc 下 block 屬性的建議寫法
arc 下 block 屬性的建議寫法
__block 可以用於解決 block 內部無法修改 auto 變數值的問題。
__block 不能修飾全域性變數、靜態變數(static)。
編譯器會將 __block 變數包裝成乙個物件。
__forwarding:指向自身的指標,存放的是__block_byref_age_0 自己的記憶體位址。
__block 修飾的變數是強引用。
arc:用__weak、__unsafe_unretained解決。
mrc:用__block、__unsafe_unretained解決。
用__block解決(必須要呼叫block)
__strong typeof(weakself)strongself = weakself;
當block從堆上移除時,都會通過dispose函式來釋放它們
如果 __block 變數從堆上移除
iOS底層原理篇 十七 Block初探
1.block的分類 常見的三種block void viewdidload block nslog block 列印結果 block探析 2300 140310 我是全域性block block探析 2300 140310 nsglobalblock 0x10d14e038 void viewdi...
block的底層實現原理
block就是指向結構體的指標,編譯器會將block的內部 生成對應的函式,利用這個指標就可以呼叫這個函式.普通的區域性變數是值傳遞,用 block static 或者是全域性變數就是位址傳遞 block的記憶體預設是存放在棧裡面的,他不會對所引用的物件進行操作 如果對block做一次copy操作b...
iOS OC語言 Block底層實現原理
先來簡單介紹一下block block是什麼?蘋果推薦的型別,效率高,在執行中儲存 用來封裝和儲存 有點像函式,block可以在任何時候執行。block和函式的相似性 1 可以儲存 2 有返回值 3 有形參 4 呼叫方式一樣。定義乙個簡單的block 我們再給a賦值為20,此時列印出來a 的值還是1...