Strong 및 Weak 참조를 이해하기 위해 아래 예제를 고려하여 displayLocalVariable이라는 이름의 메소드가 있다고 가정하십시오.
-(void)displayLocalVariable
{
NSString myName = @"ABC";
NSLog(@"My name is = %@", myName);
}
위의 myName 변수의 메소드 범위는 displayLocalVariable 메소드로 제한됩니다. 일단 메소드가 완료되면 문자열 "ABC"를 보유하고있는 myName 변수가 메모리에서 할당 해제됩니다.
뷰 컨트롤러 수명주기 내내 myName 변수 값을 유지하려면 어떻게해야합니까? 이를 위해 아래와 같이 myName 변수에 대한 강력한 참조를 갖는 username이라는 이름의 속성을 만들 수 있습니다 ( 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"문자열에 대한 강력한 참조를 가짐). 따라서 문자열 myName은 self.username이 활성화 될 때까지 메모리에서 할당 해제되지 않습니다.
이제 약한 참조 인 dummyName에 myName을 할당하십시오. self.dummyName = myName; Strong reference와 달리 Weak은 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에 대한 강력한 참조가 있으므로, myName에 연관된 참조가 있으므로 self.dummyName은 메소드가 종료 된 후에도 myName의 값을 갖습니다.
변수에 대한 강력한 참조를 만들 때마다 유지 횟수가 1 씩 증가하고 할당 해제 유지 횟수가 0에 도달하지 않습니다.
도움이 되었기를 바랍니다.
strong
,weak
하고unsafe_unretained
.