ARC所有权修饰符–__weak修饰符
在上篇ARC所有权修饰符–__strong修饰符中,看起来通过__strong修饰符就可以完美的管理内存了,但是仅仅通过__strong修饰符是不能解决“循环引用”问题的。
循环引用容易发生内存泄漏。所谓的内存泄漏就是当废弃的对象在超出其生存周期后继续存在。
怎样才能避免循环引用呢?既然有strong,就应该有weak。也就是说,使用__weak修饰符可以避免循环引用。
__weak与__strong相反,提供弱引用,弱引用不能持有对象实例。
id __weak obj = [[nsobject alloc]init];
//编译器会发生警告,(将自己生成并持有的对象赋值给附有__weak修饰符的变量obj),写成下面这样就可以了:
{
id obj = [[nsobject alloc]init];
id __weak obj1 = job;
}
因为带__weak修饰符的变量(即弱引用)不持有对象,所以在超出其变量的作用域时,对象即被释放。将可能发生循环引用的类成员变量改成附有__weak修饰符的成员变量的话,就可以避免循环引用。
__weak修饰符还有另一个有点,在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态(空弱引用)。