Чтобы понять сильные и слабые ссылки, рассмотрим пример, приведенный ниже. Предположим, у нас есть метод с именем displayLocalVariable.
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
}
В вышеупомянутом методе область действия переменной myName ограничена методом displayLocalVariable, как только метод завершится, переменная myNameкоторый содержит строку "ABC", будет освобожден из памяти.
А что если мы хотим сохранить значение переменной 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 имеет сильную ссылку (как мы объявили в интерфейсе с использованием @property) на myName (косвенно он имеет сильную ссылку на строку «ABC»).Следовательно, строка myName не будет освобождена из памяти, пока self.username не станет активным.
Теперь рассмотрите возможность назначения myName для dummyName, который является слабой ссылкой, self.dummyName = myName;В отличие от Strong reference, Weak будет хранить myName только до тех пор, пока не будет Strong reference для 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 связана ссылка Strong, связанная с ним.
Теперь, когда мы делаем ссылку Strong на переменную, количество сохраняемых данных увеличивается на единицу, а переменная не получаетколичество освобожденных удержаний достигает 0.
Надеюсь, это поможет.