iOS知識原理篇

2021-08-09 08:45:07 字數 3064 閱讀 1704

weak策略表明該屬性定義了一種「非擁有關係」 (nonowning relationship)。

為這種屬性設定新值時,設定方法既不保留新值,也不釋放舊值。此特質同assign類似;

然而在屬性所指的物件遭到摧毀時,屬性值也會清空(nil out)

runtime對註冊的類,會進行布局,會將 weak 物件放入乙個 hash 表中。

用 weak 指向的物件記憶體位址作為 key,當此物件的引用計數為0的時候會呼叫物件的 dealloc 方法,

假設 weak 指向的物件記憶體位址是a,那麼就會以a為key,在這個 weak hash表中搜尋,找到所有以a為key的 weak 物件,從而設定為 nil。

// 模擬下weak的setter方法,大致如下

- (void)setobject:(nsobject *)object

];}

每個 objective-c 物件都有相同的結構,如下圖所示

objective-c 物件的結構圖

isa指標

根類(nsobject)的例項變數

倒數第二層父類的例項變數

...父類的例項變數

類的例項變數

例項方法:

1.呼叫 -release :引用計數變為零

* 物件正在被銷毀,生命週期即將結束.

* 不能再有新的 __weak 弱引用,否則將指向 nil.

* 呼叫 [self dealloc]

2. 父類呼叫 -dealloc

* 繼承關係中最直接繼承的父類再呼叫 -dealloc

* 如果是 mrc ** 則會手動釋放例項變數們(ivars)

* 繼承關係中每一層的父類 都再呼叫 -dealloc

3. nsobject 調 -dealloc

* 只做一件事:呼叫 objective-c runtime 中的 object_dispose() 方法

4. 呼叫 object_dispose()

* 為 c++ 的例項變數們(ivars)呼叫 destructors

* 為 arc 狀態下的 例項變數們(ivars) 呼叫 -release

* 解除所有使用 runtime associate方法關聯的物件

* 解除所有 __weak 引用

* 呼叫 free()

如果在主線程中通過scheduledtimerwithtimeinterval:...方法來構建nstimer,就不需要主動啟動runloop物件,因為主線程的runloop物件在程式執行起來就已經被啟動了

// userinfo引數:用來給nstimer的userinfo屬性賦值,userinfo是唯讀的,只能在構建nstimer物件時賦值

[nstimer scheduledtimerwithtimeinterval:1.0 target:self selector:@selector(run:) userinfo:@"ya了個hoo" repeats:yes];

// scheduledtimer...方法建立出來nstimer雖然已經指定了預設模式,但是【允許你修改模式】

[[nsrunloop currentrunloop] addtimer:timer formode:nsrunloopcommonmodes];

// 【僅在子執行緒】需要手動啟動runloop物件,進入執行迴圈

使用佇列組實現上面的需求

// 建立佇列組

dispatch_group_t group = dispatch_group_create();

// 獲取全域性併發佇列

dispatch_queue_t queue = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

// 往佇列組中新增耗時操作

dispatch_group_async(group, queue, ^);

// 往佇列組中新增耗時操作

dispatch_group_async(group, queue, ^);

// 當併發佇列組中的任務執行完畢後才會執行這裡的**

dispatch_group_notify(group, queue, ^);

});

dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
-(void)barrier

); dispatch_async(queue, ^);

// 在它前面的任務執行結束後它才執行,在它後面的任務等它執行完成後才會執行

dispatch_barrier_async(queue, ^);

dispatch_async(queue, ^);

dispatch_async(queue, ^);

}

- (void)viewdidload

); nslog(@"3");

}

iOS底層原理篇 十七 Block初探

1.block的分類 常見的三種block void viewdidload block nslog block 列印結果 block探析 2300 140310 我是全域性block block探析 2300 140310 nsglobalblock 0x10d14e038 void viewdi...

Vue必會知識點 原理篇

響應式的原理 偵測資料的變化,收集檢視依賴了哪些資料,資料變化時,自動 通知 需要更新的檢視部分,並進行更新。三個步驟對應的專業術語就是 資料劫持 資料 依賴收集,發布訂閱模式。網上的vue響應式詳解 資料劫持的核心api object.defineproperty vue3改用的proxy obj...

倒車雷達原理篇

往後倒一點,再往後,打方向盤,打多了,回一點再倒,好,停!相信一般的車主在停車場泊位時,都會遇到車輛保管員的 熱情招呼 車技純熟的倒 也與人工提示配合默契 車技一般 方向感較差的,就經常使負責指揮的那位人士高度緊張,脾氣急躁的還少不了擠兌車主幾句。可是,並不是所有車主都有幸得到 人工倒車指引,比如說...