如何监控 oc 对象
1 = 对象
2 重新加载
-------------------------------------------------- -
实施ARC
苹果官方的描述称ARC是“由编译器管理的内存”,但实际上只有编译器不能完全胜任。 ARC还依赖于OC运行时库,这意味着ARC使用以下工具和库。 实施的:
● clang(LLVM编译器)3.0或更高版本
● objc4 OC运行库493.9或以上
如果按照Apple的说明,只有编译器管理内存,那么修饰符也可以在iOS 4中使用
修饰语
众所周知,修饰符提供了神奇的效用。
● 使用带有修饰符的变量意味着使用已注册的对象。
我们看一下它的实现:
{
id __weak obj_weak = obj; //obj已被赋值,并且是strong类型的
}
/*编译器的模拟代码*/
id obj_weak;
objc_initWeak(&obj_weak,obj); //初始化附有__weak修饰符的变量
objc_destroyWeak(&obj_weak); //释放该变量
都是调用函数,所以上面的代码可以转化为下面的代码
id obj_weak;
obj_weak = 0;
objc_storeWeak(&obj_weak,obj);
objc_storeWeak(&obj,0);
objc_storeWeak函数以把obj的地址作为键值,obj_weak的地址作为值存放到weak表(weak是一个hash表)中。
当一个对象被释放并被丢弃时,程序的动作是什么? 对象被释放。
1.
2.因为引用计数为0而执行
3.
4.
5.e
6. ing
然而的动作如下:
1、从弱表中获取地址为废弃对象键值的记录。
2、将记录中包含的所有修饰符变量的地址赋值为nil
3.删除弱表记录
4、从引用计数表中删除以废弃对象地址为键值的记录
按照上面的步骤,如果丢弃带有修饰符的变量所引用的对象,就会给该变量赋值nil,从而实现这个功能。
使用修饰变量的第二个作用是使用注册的对象。
{
id __weak obj_weak = obj;//obj已被赋值,并且是strong类型的
NSLog(@"%@",obj_weak);
}
代码转换成如下形式:
/*编译器的模拟代码*/
id obj_weak;
objc_initweak(&obj_weak,obj);
id tmp = objc_loadWeakRetained(&obj_weak);
objc_autorelease(tmp);
NSLog(@"%@",tmp);
objc_destroyWeak(&obj_weak);
与赋值时相比,使用带修饰符的变量时,对d函数和函数的调用较多。 这些函数的动作如下:
1、d函数取出修饰符变量引用的对象并
2. 该函数将对象注册到。
可以看到,由于修饰符变量引用的对象是这样注册的,所以可以放心使用,直到@块结束。
注意:OC中有一些类不支持ARC,比如. 可以使用 / 方法判断是否支持ARC