要理解强引用和弱引用,请考虑以下示例,假设我们有名为 displayLocalVariable 的方法。
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
在上述方法中,myView 变量的作用域仅限于 displayLocalVariable 方法,一旦方法完成,持有 UIView 对象的 myView 变量将从内存中释放。
现在,如果我们想在视图控制器的整个生命周期中保存 myView 变量怎么办。为此,我们可以创建名为 usernameView 的属性,该属性将对变量 myView 进行强引用(参见下面代码中的 @property(nonatomic,strong) UIView* usernameView; 和 self.usernameView = myView;),如下所示,
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
现在在上面的代码中,您可以看到 myView 已分配给 self.usernameView 并且 self.usernameView 对 myView 具有强引用(正如我们在接口中使用 @property 声明的那样)。因此,在 self.usernameView 存活之前,myView 不会从内存中释放。
现在考虑将 myName 分配给作为弱引用的 dummyNameView,self.dummyNameView = myView; 与强引用不同,Weak 将只保留 myView,直到有对 myView 的强引用。看下面的代码来理解弱引用,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
在上面的代码中有对 myView 的弱引用(即 self.dummyNameView 对 myView 有弱引用)但没有对 myView 的强引用,因此 self.dummyNameView 将无法保存 myView 值。
现在再次考虑下面的代码,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
在上面的代码中 self.usernameView 有一个对 myView 的强引用,因此 self.dummyNameView 现在即使在方法结束后也会有一个 myView 的值,因为 myView 有一个与之关联的强引用。
现在,每当我们对变量进行强引用时,它的保留计数都会增加 1,并且在保留计数达到 0 之前,该变量不会被释放。
希望这会有所帮助。