OC中weak的原理

作者&投稿:辟维 (若有异议请与网页底部的电邮联系)
~

  weak是OC中用于打破对象间的循环引用的一种技术。
1. weak 修饰一个变量时,表示该指针变量可以使用但不拥有该对象;及 weak 引用指向对象时,对象的引用计数并不增加。

  当 weak 引用一个对象时,Runtime会将引用的信息( key 为指向对象的指针, value 是 weak 指针的变量的地址数组)封装到 weak_entry_t 结构体中,具体存储到 DisguisedPtr 类中。
  OC的Runtime会维护一个 weak 表( weak_table_t 结构体),用于维护指向对象的所有 weak 指针,是 weak_entry_t 的结构体上的一层封装。
   weak_table_t 类型的结构体,是一个哈希表,但是在这个表中的操作并不是线程安全的。
  于是Runtime对于 weak_table_t 上又进行了一层封装,也就是 SideTable 。 SideTable 这层封装对于 weak 引用机制的主要目的是解决线程安全的问题。

   weak_entry_t 是 weak_table_t 具体存储的数据类型

DisguisedPtr<T> 是Runtime对于普通对象指针(引用)的一个封装,目的在于隐藏 weak_table_t 的内部指针。

   RefcountMap 用于OC的引用计数机制; slock 实际上是 os_unfair_lock_s 类型,用于处理线程安全的问题; weak_table 弱引用表,用于存储对象的弱引用的数组。 SideTable 提供的方法都与锁有关。

strong :该对象强引用delegate,引用计数+1,外界不能销毁 delegate 对象,会导致循环引用( Retain Cycles )

weak :指明该对象并不持有delegate这个对象,delegate的销毁由外部控制。当 delegate 指向的对象销毁后,自动 delegate = nil 。

assign :具有 weak 的效果,但需要手动设置 nil 。

为什么用 weak 不用 assign ?
assign 是指针赋值,不操作引用计数, delegate 用完后如果没有设置为 nil ,有可能产生野指针;而 weak 指向的 delegate 一旦用完,自动就 nil 了,不会产生野指针。

assign :一般修饰值类型的属性;
strong :修饰引用类型的属性,内存计数+1;
weak :修饰引用类型的属性,原理见上述讲解;但是 weak 修饰的属性虽然不持有,在释放对象时会查询和释放其对应的弱引用表,这样是会增加内存和性能上的开销。

OC Runtime之Weak(3)
OC Runtime之Weak(2)
OC Runtime之Weak(1)




iOC中block下的__block、__Strong、__weak
但这里使用 __weak ,使dispatch_async没有增加self的引用计数,这使得在系统在调度执行block之前,self可能已被销毁,但系统并不知道这个情况,导致block执行时访问已经被释放的self,而达不到预期的结果。理解这点很重要,这是许多使用 __weak,__stong 的由来,实际的过程原理与block实现有关,下文会...

c语言大神我设计的这个日历星期和日期怎么对齐?
weak ()有问题,2010时返回值为-2,当然不对了。w2=(int)(a+(a\/4)+(20\/4)-40+(2.6*(y+1))); 类型对不对啊?不知这个算法原来是什么样子,不知怎么解决。程序写的确实太糟了

c和c++区别
d、指针:C中通常使用的是原生指针(raw pointer),由于常出现程序员在申请后忘记释放造成资源泄漏的问题,在C++98中加入了“第一代”基于引用计数的智能指针auto_ptr,由于初代的各种问题(主要是无法解决循环指针),在03标准也就是TR1中引入了shared_ptr,weak_ptr和unique_ptr这三个功能各异的智能指针...

iOS中Objective-C&Swift知识点梳理
weak和unowned3. 协议 面向协议编程解决方案协议可以定义属性(必须是var)、方法、下标,注意协议中的方法不能有默认值。定义只能被类继承的协议定义可选类型的协议方法协议组合4. swift中的KVC(swift4开始,类和struct都支持KVC)方式1:继承NSObject类,且用@objc标记的属性即可使用setValue(_: forKey)...

Linux下C\/C++动态库在运行时是怎样加载进来的
这个符号可以是一个全局变量、全局函数等。在你说的C++中,重载的函数也可以理解为全局函数,会有一个属性为weak的符号。该符号的符号名如果不做修改,默认按照System V的C++ API命名规范命名(以保证linux下不同编译器编译出来的.so和.o可以通用)。但如果使用extern "C"修饰之后,变成C的函数名,则...

__attribute__((section("__CONFIG1.sec,code")))在C语言中这是啥意思...
unused • weak weak也可以通过在关键字前后使用 __(双下划线)来指定属性(例如,用 __aligned__代替aligned)。这样将使你在头文件中使用它们时不必考虑会出现与 宏同名的情况。要指定多个属性,可在双括弧内用逗号将属性分隔开,例如:__attribute__ ((aligned (16), packed))。

到底什么时候才需要在ObjC的Block中使用weakSelf\/strongSelf
});2.在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候(如下),weakSelf 有可能被释放,于是,strongSelf 就派上用场了:__weak __typeof__(self) weakSelf = self;dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY...

有关维生素C,的资料,
几乎所有的动物和植物综合有像人类和少数的其他动物这样的一些例外的他们自己的维他命 C., 包括, 猿,天竺鼠, 红色发泄的夜莺, 一个吃水果的蝙蝠和一个鳟鱼的种。 这已经引导一些科学家, 包括保罗假定的林诺斯这些种或遗失了 (或者从不有了) 能力生产他们自己的维他命 C, 而且如果他们的饮食与对在确实综合...

C库函数中strrchr函数的定义是什么?
\\0') return strchr (s, '\\0'); found = NULL; while ((p = strchr (s, c)) != NULL) { found = p; s = p + 1; } return (char *) found;}#ifdef weak_alias#undef rindexweak_alias (strrchr, rindex)#endiflibc_hidden_builtin_def (...

objectivec的runtime到底是什么?
深入探索runtime列表,我们可以清晰地看到Object-C运行时提供的一系列核心功能。例如,objc_object(id),class,protocol,method,selector,weak,sync,selector-table,RC,load,exception以及用于class的selector快速访问的cache。此外,还有几个基于LLVM的基础map,以及NSObject类的实现,这是Object-C中...

江西省18444682241: 电路中OC门是什么意思?什么原理? -
骆斩悦康: OC门就是集电极开路输出的意思,必须靠上拉电阻才能输出高电平,所以必须接上拉电阻,低电平时属于"灌电流",根据灌电流大小选择上拉电阻. OC门实际上只是一个NPN型三极管,并不输出某一特定电压值或电流值.OC门根据三极管...

江西省18444682241: OC中的ARC到底怎么回事?? -
骆斩悦康: 编译器自动给需要 retain 的引用进行 retain,而如果一个对象被声明为弱引用,就不会 retain 增加计数.当计数归零后被引用被释放.这本来就不矛盾啊.就用你自己说的话来说,就是弱引用术语不是“适当的地方”,强引用才是这个“适当的地方”

江西省18444682241: 向量三点共线定理中 OC=λOA+μOB 证明λ+μ=1 -
骆斩悦康:[答案] 设 A、B、C 三点共线, 则向量 AC// 向量AB , 所以存在实数 x 使 AC=x*AB , 即 OC-OA=x*(OB-OA) , 化为 OC=(1-x)*OA+x*OB , 所以 λ=1-x ,μ= x , 因此 λ+μ=(1-x)+x=1

江西省18444682241: 口腔中的oc,fc,cp,voco都是些什么东西,做什么用的? -
骆斩悦康: fc是甲醛甲酚,cp是樟脑酚,OC 是丁香酚,VOCO 是口腔材料制造商的品牌名字

江西省18444682241: 理论力学:图示平面机构中 曲柄OC绕O轴转动时,带动滑块A和B在同一水平槽内运动.如AC=CB -
骆斩悦康: 首先找到两个平面运动的速度瞬心为o1,o2,o1,o2都垂直于ob,o1a,o2b与cb和ca的夹角为b与a,因为ac=cb,所以a=b.根据正弦定理推出o1c=o2c.va=vc/o1c*o1a,vb=vc/o2c*o2b.即va/vb=o1a/o2b=oa/ob

江西省18444682241: 在OC中,怎样理解"引用计数"的实质 -
骆斩悦康: 1、OC是面向对象语言,引用计数是用来释放已经创建的对象才引入的.2、新建一个对象时,这个对象的计数器会加一,或者有其他的对象类型指针指向这个对象时,计数器也会加一,也可以通过release方法来使计数器减一,来达到释放对象的目的,只要对象的计数器为0,那这个对象就会释放.3、新版本的Xcode已经使用ARC模式自动释放对象,不需要再麻烦使用原来的MRC模式来使用引用计数了.

江西省18444682241: weak的实现原理是什么 ios -
骆斩悦康: ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC).Automatic Reference Counting (ARC) is a compiler-level feature that simplifies the process of managing object lifetimes (memory management) in Cocoa ...

江西省18444682241: Java中的强引用,软引用,弱引用,虚引用有什么用 -
骆斩悦康: 强引用,任何时候都不会被;垃圾回收器回收,如果内存不足,宁愿抛出OutOfMemoryError 软引用,只有在内存将满的时候才会被垃圾回收器回收,如果还有可用内存,垃圾回收器不会回收 弱引用,只要垃圾回收器运行,就肯定会被回收,不...

江西省18444682241: 请按照以下要求,编写一个程序实现判断字符串中是否存在png,如果有就删除它 oc -
骆斩悦康: OC中内存管理机制应该就是引用计数的增减吧,retainCount为0时释放该内存. retain对应的是release,内存的释放用release. alloc对应的是dealloc,内存的销毁用dealloc. readwrite此标记说明属性会被当成读写的,这也是默认属性. ...

江西省18444682241: oc属性声明中,赋值方式分几种情况 分别适用于什么类型的数据 -
骆斩悦康: 所用关键字:@property和@synthesize.二者需要配对使用.@property是在头文件的类中对setter和getter方法进行声明的,而@synthesize是在.m文件内对声明的方法进行实现的,格式如下:@synthesize 成员名1,成员名2,,, 而在对应的....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网