第一、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>