weak特性总结

1. weak特性是在iOS4之后才开始支持的,即iOS4及以下是不能使用__weak修饰符的。

2. 若变量使用__weak修饰,则当其所引用的对象被release时,变量会自动被设置为nil。

原理:
系统有一个全局的weak对象哈希表,表中每个条目的key为weak变量所指对象的内存地址,value是由所有指向该对象的weak变量的内存地址组成的集合。在对weak变量赋值时,以赋值对象的内存地址为key,将weak变量地址加入到对应集合中,实现weak对象的注册。对象被release时,从weak对象哈希表中查找以对象的内存地址为key的weak变量地址集合,遍历集合将其中所有变量设置为nil,最后从weak表中删除该条目。

3. 使用weak变量,即是使用注册到autoreleasepool中的对象。

4. 只在必要的时候使用weak特性,如果滥用会浪费CPU资源。

5. 使用weak型变量时,最好暂时将weak对象赋值给一个strong变量再使用。因为每次使用weak变量时,都会向autoreleasepool中注册一次对象,频繁注册导致资源浪费。

6. 不是所有的类的对象都能使用__weak修饰。一、声明时指定了 NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE 的类的对象都不能使用__weak修饰,比如NSMachPort。二、重写了NSObject内部的allowsWeakReference/retainWeakReference实例方法,并返回NO的类的对象不能使用__weak修饰。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 5,305评论 1 17
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,270评论 30 472
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 1,480评论 1 27
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,775评论 0 4
  •  定义文件 PCTP中SMOC控制器的定义文件是格式为“controller name. EXA”的文件。使...
    橡果阅读 366评论 0 0