为了理解强弱参考,请考虑以下示例,假设我们有一个名为displayLocalVariable的方法。
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
}
在上述方法中,myName变量的作用域仅限于displayLocalVariable方法,一旦方法完成,保存字符串“ ABC”的myName变量将从内存中释放。
现在,如果我们想在整个视图控制器生命周期中保留myName变量值,该怎么办。为此,我们可以创建名为username的属性,该属性具有对变量myName的强引用(请参见self.username = myName;
下面的代码),如下所示,
@interface LoginViewController ()
@property(nonatomic,strong) NSString* username;
@property(nonatomic,weak) NSString* dummyName;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.username = myName;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
现在,在上面的代码中,您可以看到myName已分配给self.username,并且self.username具有对myName的强引用(如我们在接口中使用@property在接口中声明的那样)(间接具有对“ ABC”字符串的强引用)。因此,直到self.username处于活动状态时,字符串myName才会从内存中释放。
现在考虑将myName分配给一个虚弱引用的dummyName,self.dummyName = myName; 与强引用不同,弱将仅保留myName直到存在对myName的强引用。请参阅以下代码以了解弱引用,
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.dummyName = myName;
}
在上面的代码中,对myName的引用较弱(即self.dummyName对myName的引用较弱),但对myName没有强引用,因此self.dummyName将无法保存myName值。
现在再次考虑以下代码,
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
self.username = myName;
self.dummyName = myName;
}
在上面的代码中,self.username具有对myName的强引用,因此,即使方法结束后self.dummyName现在也具有myName的值,因为myName具有与其关联的强引用。
现在,每当我们对变量进行强引用时,其保留计数将增加一,并且该变量将不会被释放,保留计数将达到0。
希望这可以帮助。
strong
,weak
和unsafe_unretained
。