NSObject
声明
1 | @interface NSObject <NSObject> { |
NSObject 包含Class isa,我们来看下Class的定义
1 | typedef struct objc_class *Class; |
创建
初始化Class (Runtime自动创建)
1 | static Class |
调用alloc
1 | + (id)alloc { |
调用init
1 | - (id)init { |
从上面的代码可以看出new就是[[Class alloc] init]
retain
1 | - (id)retain { |
release
1 | - (oneway void)release { |
autorelease
1 | - (id)autorelease { |
autoreleasePool
1 | static inline void *push() { |
上面的retain/release都提到了SideTable结构体,其实例是全局的。SideTable管理引用计数的增加与减少和weak指针。
SideTable
1 | struct SideTable { |
引用计数上面已经介绍过了,下面再说说weak references table
weak references table
1 | /** |
weak_register_no_lock
1 | id weak_register_no_lock(weak_table_t *weak_table, id referent_id, |
1 | static void append_referrer(weak_entry_t *entry, objc_object **new_referrer) |
从上面的代码可以看出:weak_table_t使用对象的hash_pointer值作为index,weak_entry_t作为value。
weak_unregister_no_lock
1 | /* 清理已注册的weak引用列表 */ |
dealloc
1 | - (void)dealloc { |
最终都会调用对象的SideTable的weak_clear_no_lock方法清理掉该对象的weak_entry_t以及weak_entry_t里的所有weak引用置nil。
1 | void weak_clear_no_lock(weak_table_t *weak_table, id referent_id) { |