weak故名思义就是弱~与其相对应的不免想到strong。所以作为小受的weak它本身是一种非拥有的关系。
那什么是“非拥有”呢?就是我不曾拥有过你,但是我的钱包里有你的照片。本身不持有这个对象,但能和其建立联系,当对象销毁时自动设为nil,这个assign类似,不过assign只能针对纯量类型,进行简单赋值。不过weak只能针对oc对象,而assign却可以用于非oc对象。
那weak大概是如何实现的呢?我们用runtime脑补一波。runtime对注册的类会放入一个hash表中,当计数为0时出发dealloc,这时候检查表中对在这表中用weak指向这个对象的全部设置为nil。首先,我们设计一个绑定函数objc_storeWeak(&a, b) &a为内存地址 b为对象 。当b为nil时,a设置为nil;当b不为nil时,a,b指向同一块内存。
在对局部变量设置为weak时,直接在前面加上__weak。比如在对block内使用self时一定要用__weak说三遍!!!否则self和block相互持有,这样会造成循环引用,导致内存对关系没理清而造成卡死。
还有比如delegate也是需要使用weak,assign也可以。否则也会有循环引用的现象。
大概就是如此,如果还有什么新的知识点请告诉我!THX
网友评论