iOS-底层原理26:weak原理
weak是OC中用于打破对象间的循环引用的一种技术。 weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。
weak_table_t 是全局的弱引用表,将对象id存储为键,将 weak_entry_t 存储为它们的值。在我们的App中,多个对象会重用同一个 SideTable 节点,也就是说, weak_table 会存储多个对象的弱引用信息。
底层原理毫无疑问还是iOS开发现在必备能力。
iOS开发中的循环引用
1、修饰对象不会增加其引用计数,避免了循环引用。 如果被修饰的对象在某一时机被释放,会产生 悬垂指针 ,再通过这个指针去访问原对象的话,会导致内存泄露,所以一般不建议用,__unsafe_unretained去解除循环引用。
2、可以用weak修饰delegate。NSTimer 1首先我们声明timer的时候,使用strong修饰的,self对timer进行的强引用,如下 2创建timer时,target对self又进行了强引用 至此,循环引用已经形成。
3、在iOS开发中,循环引用常常发生在使用Block、Delegate和通知等机制时。为了避免循环引用,可以使用weak、strong和copy等关键字来修饰对象,明确表达对象之间的拥有关系。
4、循环引用是iOS开发中经常遇到的问题,它指的是两个或多个对象通过相互之间的强引用,形成了一个保留环,即使已经没有外部对象持有,也无法对其进行释放操作,也无法释放其占用的内存空间(引用计数器始终大于0)。
5、出现循环引用的三种情况:声明代理delegate属性 使用block时 使用NSTimer的时候 代理属性导致循环引用。
OC中weak的原理
1、weak是OC中用于打破对象间的循环引用的一种技术。 weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。
2、weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。copy与strong类似。
3、在 delegate,block,NSTimer 等中使用,以避免循环引用所带来的内存泄漏。我们使用xib时,拖出来的控件都使用weak这一属性。
4、在ObjectiveC里,[email protected]@property有一对属性:strong 和 weak。
5、使用 __weak 修饰self,使其在block中不被持有,打破循环引用。开始状态如下 当someObj对象释放self对象时,Self的retainCount为0,走dealloc,释放myBlock对象,使其retainCount也为0。
关于iOS基本属性修饰符的理解(weak篇)
assign assign主要用来修饰基本数据类型,例如int,float,NSInteger,CGFloat,储存在栈中内存不需要管理,一般不修饰对象,不然对象内存地址被释放,但是指针不会释放就会造成野指针。
在 Student 类中添加分别由 strong 、 copy 、 weak 修饰的属性:在通过 Clang 编译后的 .cpp 文件中,看到会生成三个对应的 setter 方法:唯独在 setAge 的方法调用中,是通过 objc_setProperty 方法实现的。
Weak+Controller是一种模式设计模式,简称WC模式。主要用于分离组件操作逻辑和组件控制逻辑。其中Weak表示要访问的操作逻辑组件,它不会调用任何其它的代码。
ARC的修饰符 ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。__strong 表示引用为强引用。对应在定义property时的strong。
[email protected],分别用逗号分隔,但是,在上述修饰符中,1,2,3组中的属性分别之恩那个出现一个,只有4中可以同时出现。
你可以直接在你的类里面写和实体类里面的属性一样的属性名字就可以了 如:实体类里面有一个 String name; 在你现在的类里面你也可以直接写一个 String name 并给他get 和set方法,但是这个意义并不大。
ios中什么是弱变量跟强变量
1、首先strong和weak这两个关键字是用来修饰变量,表示这个变量是强(strong)引用和弱(weak)引用 我们在程序中经常会用到“[[class alloc]init]” 这样的代码,我想你对它已经很熟。这是在开辟一块内存,并初始化。
2、weak表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。weak表示一个指针对一块内存进行弱引用。弱引用就是不增加所指向内存的引用计数。
3、Objective-C支持包含对象的强弱两个类型的变量。 在变量声明时,强类型的变量包含类名,弱类型的变量使用类型 id 代替对象。 弱类型变量在像集合类中使用频繁,在一个集合中的对象的实际类型可能是未知的。
4、就是说js中变量可以被赋予不同类型的值都不会报错。而java中 int a = 8;就不能在对a赋值个字符串如:a= asa//这个时候java就会报编译时错误,你把一个String字符串赋值给一个int类型变量。
5、在这个对象的生命周期中,会有很多变量来指向和引用它。指向这个对象的变量也可以通过release方法来解除这种拥有权。release方法将会告诉运行时,我已经使用完这个变量了,已经不需要它了,retainCount计数减1。
6、弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译期进行检查。JAVA是强类型语言;因此每个变量和对象都必须具有声明类型。