logo
本系列博客是本人的源碼閱讀筆記,如果有 iOS 開發(fā)者在看 runtime 的哼御,歡迎大家多多交流焊唬。
前言
上一篇文章筆者講解了 load 方法的準備工作,主要是將擁有 load 方法的類或者分類找出來赶促,并將其放入到靜態(tài)變量數(shù)組 loadable_classes 以及 loadable_categories 中鸥滨,并在文章中給出猜測 load 方法調(diào)用的順序谤祖。本文將給大家介紹 load 方法的調(diào)用過程老速。
分析
call load 方法代碼如下:
void call_load_methods(void)
{
static bool loading = NO;
bool more_categories;
loadMethodLock.assertLocked();
// Re-entrant calls do nothing; the outermost call will finish the job.
if (loading) return;
loading = YES;
void *pool = objc_autoreleasePoolPush();
do {
// 1. Repeatedly call class +loads until there aren't any more
while (loadable_classes_used > 0) {
call_class_loads();
}
// 2. Call category +loads ONCE
more_categories = call_category_loads();
// 3. Run more +loads if there are classes OR more untried categories
} while (loadable_classes_used > 0 || more_categories);
objc_autoreleasePoolPop(pool);
loading = NO;
}