weak是OC中用于打破对象间的循环引用的一种技术。 weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。
站在用户的角度思考问题,与客户深入沟通,找到天山网站设计与天山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站制作、企业官网、英文网站、手机端网站、网站推广、空间域名、虚拟空间、企业邮箱。业务覆盖天山地区。
weak_table_t 是全局的弱引用表,将对象id存储为键,将 weak_entry_t 存储为它们的值。在我们的App中,多个对象会重用同一个 SideTable 节点,也就是说, weak_table 会存储多个对象的弱引用信息。
底层原理毫无疑问还是iOS开发现在必备能力。
weak表示一个指针对一块内存进行弱引用。弱引用就是不增加所指向内存的引用计数。assign主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。
1、weak是OC中用于打破对象间的循环引用的一种技术。 weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。
2、weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。copy与strong类似。
3、在 delegate,block,NSTimer 等中使用,以避免循环引用所带来的内存泄漏。我们使用xib时,拖出来的控件都使用weak这一属性。
4、在ObjectiveC里,用@property访问所有的实例变量。@property有一对属性:strong 和 weak。
5、使用 __weak 修饰self,使其在block中不被持有,打破循环引用。开始状态如下 当someObj对象释放self对象时,Self的retainCount为0,走dealloc,释放myBlock对象,使其retainCount也为0。
weak是OC中用于打破对象间的循环引用的一种技术。 weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。
weak_table_t 是全局的弱引用表,将对象id存储为键,将 weak_entry_t 存储为它们的值。在我们的App中,多个对象会重用同一个 SideTable 节点,也就是说, weak_table 会存储多个对象的弱引用信息。
根据苹果guan 方文档的建议,如果捕获的引用永远不会变为 nil ,我们应该使用 unowned ,否则应该使用 weak 。
理解这点很重要,这是许多使用 __weak,__stong 的由来,实际的过程原理与block实现有关,下文会补充,这里先记住这点。注:如果是在MRC模式下,使用 __block 修饰self,则此时block访问被释放的self,则会导致crash。
如果使用weak,对性能的需求是要大于strong的,可能是这个原因导致的,这个只是猜测。如果有哪位同行知道原理或者猜测可能,希望能讲解一二 。如果是我们自定义的对象,是不能用 weak 来声明的,编译器会直接报错。
WeakHashMap:WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。
1、weak weak只能用来修饰对象,但是并不持有,引用计数不会+1。在Runtime中对该属性进行了操作,指向的内存被释放后(引用计数为0),指针就会自动=nil,多用于避免循环引用的地方。
2、第二种:我们给控制器增加一个属性,指向我们的子视图。这个属性有两种可能,一种是strong,一种是weak。我们先来试试strong。从结果可以看出,点击按钮子视图是移除了,但是对象没有被销毁。
3、weak 和strong的区别:(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
4、strong和weak的区别 strong表示保留它指向的堆上的内存区域不再指向这块区域了。