1、weak是弱引用,所引用的对象计数不会加1。 2、weak变量在其引用的对象被销毁之后,会被置为nil。 3、weak通常用于block, delegate, NSTimer,以解决循环引用带来的内存泄漏问题。 1 2 NSObject*obj = [[NSObjectalloc] init];// obj是被引用对象的指针 id__weak obj1 = obj;// obj1是weak变量,也是被...
strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。 @property(strong) MyClass *myObject; 相当于@property(retain) MyClass *myObject; @property(weak) MyOtherClass *delegate; 相当于@proper...
在weak_table_t中,持有了weak_entry_t指针,这个指针指向一个数组,数组中每个weak_entry_t代表着一个弱引用项,这个数组模拟实现了hash。 struct weak_entry_t { DisguisedPtr<objc_object> referent; union { struct { weak_referrer_t *referrers; //weak指针数组 uintptr_t out_of_line_ness : 2; uintpt...
objc-weak源码 #define WEAK_INLINE_COUNT 4 #define REFERRERS_OUT_OF_LINE 2 struct weak_entry_t { DisguisedPtr<objc_object> referent; union { struct { weak_referrer_t *referrers; uintptr_t out_of_line_ness : 2; uintptr_t num_refs : PTR_MINUS_2; uintptr_t mask; uintptr_t max_ha...
static void append_referrer(weak_entry_t *entry, objc_object **new_referrer); 函数功能如其名,往指定的weak_entry_t里面添加new_referrer(weak变量的地址)。这里只是声明,具体实现在后面,这个声明只是为了给下面的其他函数的提前调用作的声明。 objc_weak_error ...
weak_entry_t(objc_object *newReferent, objc_object **newReferrer) : referent(newReferent) { inline_referrers[0] = newReferrer; for (int i = 1; i < WEAK_INLINE_COUNT; i++) { inline_referrers[i] = nil; } } 在创建weak_entry_t实例的时候,默认是使用inline_referrers的方式来管理对象引...
Objective-C创建对象需通过alloc以及init两个消息。alloc的作用是分配内存,init则是初始化对象。 init与alloc都是定义在NSObject里的方法,父对象收到这两个信息并做出正确回应后,新对象才创建完毕。以下为范例: MyObject*my=[[MyObjectalloc]init]; 在Objective-C 2.0里,若创建对象不需要参数,则可直接使用new ...
初学oc,在网上我看到了strong和weak的解释:只要有一个强引用还未被释放,就算把所有弱引用释放了,这个引用也不会被释放。但是我想问怎么创建一个只有弱引用的变量,如果创建了,会发生什么情况。我在学习中遇到过一个问题, @interface ViewController () // 我用声明了一个弱引用属性 一个label标签 @property (wea...
● 存储(assign、retain、copy、strong、weak):标准变量类型默认使用 assign 存储类 型,而对象默认使用 retain 来增加值的引用计数(当值被改变或释放时也只是简单 地调用 release 来释放它)。如果一个对象支持它,可以使用 copy 命令表明这个对象应该被批量复制,而不是简单地执行 retain(用于可变值)。strong 和 weak...
weak表是一个hash表,存储了弱引用对象以及相关的所有弱引用的信息。key为对象的地址,value为指向该对象的weak指针地址数组。 /** * The global weak references table. Stores object ids as keys, * and weak_entry_t structs as their values. */ ...