저는 Obj-C를 처음 사용하므로 첫 번째 질문은 다음과 같습니다.
의 차이점은 무엇입니까 strong와 weak의 @property객체에 대한 포인터의 선언은?
또한 무엇을 nonatomic의미합니까?
저는 Obj-C를 처음 사용하므로 첫 번째 질문은 다음과 같습니다.
의 차이점은 무엇입니까 strong와 weak의 @property객체에 대한 포인터의 선언은?
또한 무엇을 nonatomic의미합니까?
답변:
강력한 참조 (대부분의 경우에 사용됨)는이 속성 / 변수를 참조하는 개체를 "소유"하고자 함을 의미합니다. 컴파일러는이 속성에 할당 한 객체가 강력한 참조로 가리키고있는 한 파괴되지 않도록주의합니다. 속성을 한 번만 설정하면 nil객체가 손상됩니다 (하나 이상의 다른 객체가 객체를 강력하게 참조하지 않는 한).
대조적으로, 약한 참조로 객체의 수명을 제어하고 싶지 않다는 것을 나타냅니다. 약하게 참조하는 객체는 적어도 하나의 다른 객체가 그것에 대한 강한 참조를 가지고 있기 때문에 계속 존재합니다. 이것이 더 이상 적용되지 않으면 객체가 파괴되고 약한 속성이 자동으로 설정됩니다 nil. iOS에서 약한 참조의 가장 빈번한 사용 사례는 다음과 같습니다.
유지주기를 피하기 위해 종종 약하게 참조되는 위임 속성
뷰 컨트롤러의 메인 뷰의 서브 뷰 / 컨트롤은 해당 뷰가 이미 메인 뷰에 의해 강력하게 유지되어 있기 때문입니다.
atomic 대 nonatomic은 컴파일러가 속성에 대해 합성하는 getter 및 setter 메서드의 스레드 안전성을 나타냅니다. atomic (기본값)은 컴파일러에 접근 자 메소드를 스레드로부터 안전하게 설정하고 (ivar에 액세스하기 전에 잠금을 추가하여) 비원 자적으로 반대입니다. 비원 자의 장점은 약간 더 높은 성능입니다. iOS에서 Apple은 거의 모든 속성에 비원자를 사용하므로 일반적인 조언은 동일한 작업을 수행하는 것입니다.
atomic것을 보장 속성이 안전하게 읽고 동시에 여러 스레드에서 쓸 수 있습니다. 그렇다고 모든 속성 atomic이 자동으로 스레드로부터 안전하다는 의미는 아닙니다 .
풍선의 관점에서 강하고 약한 참조에 대해 생각하는 것이 도움이 될 수 있습니다.
풍선에 부착 된 끈을 한 명 이상 잡고 있으면 풍선이 날아 가지 않습니다. 줄을 들고있는 사람의 수는 유지 횟수입니다. 아무도 끈을 잡고 있지 않으면 ballon이 날아갑니다 (dealloc). 많은 사람들이 같은 풍선에 줄을 가질 수 있습니다. 강한 참조와 약한 참조를 모두 사용하여 참조 된 객체에서 속성을 가져 오거나 설정할 수 있습니다.
강한 참조는 풍선에 끈을 붙잡고있는 것과 같습니다. 풍선에 부착 된 끈을 잡고있는 한 날아 가지 않습니다.
약한 참조는 풍선을 보는 것과 같습니다. 볼 수 있고, 속성에 액세스하고, 메서드를 호출하지만 해당 풍선에 문자열이 없습니다. 줄을 잡고있는 모든 사람이 갈 수 있으면 풍선이 날아가서 더 이상 액세스 할 수 없습니다.
strong을 weak의미 하는지 실제로 이해하고 있다고 생각 합니다.
더미 답변 :-
나는 위의 답변에 설명이 있다고 생각하므로 어디에서 사용해야 STRONG하고 어디에서 사용 해야하는지 말할 것입니다 WEAK.
의 사용 Weak: -
1. 대표 2. 콘센트 3. 서브 뷰 4. 제어 등
사용 Strong:-에
포함되지 않은 모든 곳에 남아 있습니다 WEAK.
강력한 와 약한 주변에 이러한 키워드가 공전 객체 소유 목표 - C에서
객체 소유권이란 무엇입니까?
포인터 변수는 그들이 가리키는 객체의 소유권을 의미합니다.
포인터 변수가 객체를 가리킬 때마다 해당 객체에 소유자가 있으며 계속 유지됩니다. 이것은 강력한 참조 로 알려져 있습니다.
변수는 선택적으로 객체의 소유권을 가질 수 없습니다. 객체의 소유권을 가지지 않는 변수를 약한 참조라고합니다.
자세한 설명을 보려면 여기에서 @property 및 속성을 이해하십시오.
여기에서 Apple Documentation 은 다양한 예제를 사용하여 약한 속성과 강한 속성의 차이점을 설명했습니다.
여기,이 블로그에서 저자는 모든 장소를 같은 장소에 모았습니다. 속성 특성을 비교하는 데 도움이됩니다.
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
Strong 및 Weak 참조를 이해하기 위해 아래 예제를 고려하여 displayLocalVariable이라는 이름의 메소드가 있다고 가정하십시오.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
위의 myView 변수의 메소드 범위는 displayLocalVariable 메소드로 제한됩니다. 일단 메소드가 완료되면 UIView 오브젝트를 보유하고있는 myView 변수가 메모리에서 할당 해제됩니다.
이제 뷰 컨트롤러의 수명주기 동안 myView 변수를 유지하려면 어떻게해야합니까? 이를 위해 우리는 변수 MYVIEW에 강한 참조 (참조해야합니다 usernameView로 명명 된 프로퍼티 만들 수 있습니다 @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를 사용하여 인터페이스에 선언)를 가지고 있음을 알 수 있습니다. 따라서 myView는 self.usernameView가 활성화 될 때까지 메모리에서 할당 해제되지 않습니다.
이제 약한 참조 인 dummyNameView에 myName을 할당하는 것을 고려하십시오. self.dummyNameView = myView;Strong 참조와 달리 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에 대한 강력한 참조를 가지므로, myView에 연관된 참조가 있으므로 self.dummyNameView는 메소드가 종료 된 후에도 myView의 값을 갖습니다.
변수에 대한 강력한 참조를 만들 때마다 유지 횟수가 1 씩 증가하고 유지 횟수가 0에 도달 할 때까지 변수가 할당 해제되지 않습니다.
도움이 되었기를 바랍니다.