首页 > 代码库 > __weak修饰符详解
__weak修饰符详解
第一、weak弱引用不能持有对象实例。
在持有某对象的弱引用时,若该对象被废弃,则此弱引用自动失效并处于nil被赋值的状态。
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的弱引用
*/
obj1=obj0;
}
此时,obj0变量超出其作用域,强引用失败,自动释放持有对象,调用Test类的dealloc函数
如果把obj1声明为strong
id __strong obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的强引用
*/
obj1=obj0;
}
此时,obj0变量超出其作用域,但obj1为强引用,所以不会释放对象
第三、
__weak变量,当宿主对象被释放的释放,它自动会变为weak,通过下面两个实例可以看到
id __weak obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的弱引用
*/
obj1=obj0;
}
NSLog(@"%@",obj1);
输出结果为:nil
id __strong obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的强引用
*/
obj1=obj0;
}
NSLog(@"%@",obj1);
输出结果:
<Test: 0x100100350>
在持有某对象的弱引用时,若该对象被废弃,则此弱引用自动失效并处于nil被赋值的状态。
第二、实例
id __weak obj1=nil;
{/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的弱引用
*/
obj1=obj0;
}
此时,obj0变量超出其作用域,强引用失败,自动释放持有对象,调用Test类的dealloc函数
如果把obj1声明为strong
id __strong obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的强引用
*/
obj1=obj0;
}
此时,obj0变量超出其作用域,但obj1为强引用,所以不会释放对象
第三、
__weak变量,当宿主对象被释放的释放,它自动会变为weak,通过下面两个实例可以看到
id __weak obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的弱引用
*/
obj1=obj0;
}
NSLog(@"%@",obj1);
输出结果为:nil
id __strong obj1=nil;
{
/*
* 生成并持有对象A
*/
id __strong obj0=[[Test alloc] init];
/*
* obj1为对象的强引用
*/
obj1=obj0;
}
NSLog(@"%@",obj1);
输出结果:
<Test: 0x100100350>
__weak修饰符详解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。