File tree Expand file tree Collapse file tree 1 file changed +45
-0
lines changed Expand file tree Collapse file tree 1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change @@ -771,6 +771,51 @@ typedef struct {
771771
772772(注:在下文的《使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?》里给出的“对象的内存销毁时间表”也提到` __weak ` 引用的解除时间。)
773773
774+
775+ 先看下 runtime 里源码的实现:
776+
777+
778+ ``` Objective-C
779+ /* *
780+ * The internal structure stored in the weak references table.
781+ * It maintains and stores
782+ * a hash set of weak references pointing to an object.
783+ * If out_of_line==0, the set is instead a small inline array.
784+ */
785+ #define WEAK_INLINE_COUNT 4
786+ struct weak_entry_t {
787+ DisguisedPtr<objc_object> referent;
788+ union {
789+ struct {
790+ weak_referrer_t * referrers;
791+ uintptr_t out_of_line : 1;
792+ uintptr_t num_refs : PTR_MINUS_1;
793+ uintptr_t mask;
794+ uintptr_t max_hash_displacement;
795+ };
796+ struct {
797+ // out_of_line=0 is LSB of one of these (don't care which)
798+ weak_referrer_t inline_referrers[ WEAK_INLINE_COUNT] ;
799+ };
800+ };
801+ };
802+
803+ /* *
804+ * The global weak references table. Stores object ids as keys,
805+ * and weak_entry_t structs as their values.
806+ */
807+ struct weak_table_t {
808+ weak_entry_t *weak_entries;
809+ size_t num_entries;
810+ uintptr_t mask;
811+ uintptr_t max_hash_displacement;
812+ };
813+ ```
814+
815+ 具体完整实现参照 [ objc/objc-weak.h] ( https://opensource.apple.com/source/objc4/objc4-646/runtime/objc-weak.h ) 。
816+
817+
818+
774819我们可以设计一个函数(伪代码)来表示上述机制:
775820
776821` objc_storeWeak(&a, b) ` 函数:
You can’t perform that action at this time.
0 commit comments