목표 C에서 강한 것과 약한 것의 차이
사이의 차이점은 무엇입니까?strong
그리고.weak
@property
객체에 대한 포인터 선언?
또한, 무이가 입니까?nonatomic
비열한?
풍선의 관점에서 강한 언급과 약한 언급을 생각하는 것이 도움이 될 수 있습니다.
풍선은 적어도 한 사람이 그것에 부착된 끈을 잡고 있는 한 날아가지 않을 것입니다.현을 잡고 있는 사람들의 수는 유지 카운트입니다.아무도 끈을 붙잡고 있지 않을 때, 풍선은 날아갈 것입니다(할당 해제).많은 사람들이 같은 풍선에 줄을 댈 수 있습니다.강한 참조와 약한 참조를 모두 사용하여 참조된 개체에 대한 속성 및 호출 메서드를 가져오거나 설정할 수 있습니다.
강한 언급은 그 풍선에 줄을 잡고 있는 것과 같습니다.여러분이 풍선에 붙어 있는 끈을 잡고 있는 한, 풍선은 날아가지 않을 것입니다.
약한 참조는 풍선을 보는 것과 같습니다.당신은 그것을 보고, 그것의 속성에 접근하고, 그것을 메소드라고 부를 수 있지만, 당신은 그 풍선에 대한 끈이 없습니다.끈을 잡고 있던 사람들이 손을 놓으면 풍선이 날아가 버리기 때문에 더 이상 접근할 수 없습니다.
강력한 참조(대부분의 경우 사용)는 이 속성/변수로 참조하는 개체를 "소유"하려는 것을 의미합니다.컴파일러는 사용자가 강력한 참조로 이 속성을 가리키는 한 이 속성에 할당한 개체가 삭제되지 않도록 주의합니다.을 속을다음설경정우한에만로으로 nil
개체가 삭제됩니다(하나 이상의 다른 개체에도 강력한 참조가 있는 경우 제외).
대조적으로 약한 참조의 경우 개체의 수명을 제어하지 않으려는 것입니다.약하게 참조하고 있는 개체는 적어도 하나의 다른 개체가 강력한 참조를 가지고 있기 때문에 개체에만 적용됩니다. 더 않으면, 그으로 더이상그않개파약체괴속고자한설다동정니됩로으성으로 입니다.nil
에서 약한 는 다음과 iOS 서약참한가자다사같음습다니과는례는하에사.
주기 유지를 방지하기 위해 종종 약하게 참조되는 대리자 특성
뷰가 이미 기본 뷰에 의해 강력하게 유지되고 있기 때문에 뷰 컨트롤러의 기본 뷰에 대한 하위 뷰/하위 뷰입니다.
atomic vs. nonatomic은 컴파일러가 속성에 대해 합성하는 getter 및 setter 메서드의 스레드 안전성을 나타냅니다.atomic(기본값)은 컴파일러에게 접근자 메소드를 스레드 세이프로 만들라고 말하고, nonatomic은 반대로 합니다.원자가 아닌 것의 장점은 약간 더 높은 성능입니다.iOS에서 Apple은 거의 모든 속성에 대해 원자가 아닌 것을 사용하므로 일반적인 조언은 동일하게 하는 것입니다.
strong: 들어오는 값을 할당하면 들어오는 값이 유지되고 인스턴스 변수의 기존 값이 해제됩니다.
weak: 수신 값을 유지하지 않고 할당합니다.
따라서 기본적인 차이점은 새로운 변수를 유지하는 것입니다.일반적으로 유지하고 싶지만 원하지 않는 상황이 있을 수 있습니다. 그렇지 않으면 유지 주기가 발생하여 개체의 메모리를 해제할 수 없습니다.예를 들어 obj1은 obj2를 유지하고 obj2는 obj1을 유지합니다.이러한 상황을 해결하기 위해 약한 참조를 사용합니다.
가짜 대답 :-
위 답변에 설명이 있는 것 같으니, 어디서 어디서 사용해야 하는지만 알려드리겠습니다.
용도: - 1. 딜러 2.3번 출구.부감도 4.제어 등
사용 :- 에 포함되지 않은 모든 곳에 남습니다.
강하고 약한 이 키워드는 Objective-C에서 객체 소유권을 중심으로 진행됩니다.
개체 소유권이란 무엇입니까?
포인터 변수는 포인터가 가리키는 개체의 소유권을 의미합니다.
- 메서드(또는 함수)에 개체를 가리키는 로컬 변수가 있는 경우, 해당 변수는 가리킬 개체를 소유한다고 합니다.
- 개체에 다른 개체를 가리키는 인스턴스 변수가 있는 경우 포인터가 있는 개체가 가리키는 개체를 소유한다고 합니다.
포인터 변수가 개체를 가리킬 때마다 해당 개체는 소유자가 있으며 활성 상태를 유지합니다.이것은 강력한 참조로 알려져 있습니다.
변수는 선택적으로 가리키는 개체의 소유권을 가질 수 없습니다.개체의 소유권을 갖지 않는 변수를 약한 참조라고 합니다.
여기서 자세한 설명을 확인하십시오. @ 속성 및 속성 설명 설명합니다.
여기서 Apple Documentation은 다양한 예를 사용하여 약한 속성과 강한 속성의 차이를 설명했습니다.
여기에서 이 블로그 작성자는 모든 속성을 동일한 위치에 수집했습니다.속성 특성을 비교하는 데 도움이 됩니다.
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
strong이 기본값입니다.개체에 대한 강력한 포인터가 있는 한 개체는 "활성" 상태로 유지됩니다.
weak는 참조된 개체를 활성 상태로 유지하지 않는 참조를 지정합니다.개체에 대한 강력한 참조가 없는 경우 약한 참조가 0으로 설정됩니다.
Strong 및 Weak 참조를 이해하려면 아래의 예를 참조하십시오. displayLocalVariable이라는 이름의 메서드가 있다고 가정합니다.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
위의 메서드에서 myView 변수의 범위는 LocalVariable 메서드를 표시하는 것으로 제한됩니다. 메서드가 완료되면 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는 (@property를 사용하여 인터페이스에서 선언한 대로) myView에 대한 강력한 참조를 가지고 있습니다.따라서 self.usernameView가 활성화될 때까지 myView는 메모리에서 할당 해제되지 않습니다.
- 약한 참조
이제 약한 참조인 dummyNameView에 내 이름을 할당하는 것을 고려해 보십시오.self.dummyNameView = 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에 대한 강한 참조가 있습니다.myView에 strong 참조가 연결되어 있으므로 method가 종료된 후에도 dummyNameView의 값이 있습니다.
이제 변수에 대해 강한 참조를 할 때마다 유지 카운트가 1씩 증가하고 유지 카운트가 0에 도달할 때까지 변수의 할당이 해제되지 않습니다.
이게 도움이 되길 바랍니다.
Strong: 기본적으로 속성과 함께 사용됩니다. 다른 클래스에서 데이터를 가져오거나 다른 클래스로 전송할 때 사용했습니다.취약성: 일반적으로 모든 콘센트는 인터페이스의 취약성 유형입니다.
원자: 이러한 유형의 속성은 콘센트 또는 개체를 서로 다른 동시 스레드로 공유하지 않을 때 사용됩니다.다시 말해, 원자 인스턴스는 한 번에 하나의 스레드를 처리하는 속성을 만듭니다.그것이 당신에게 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/11013587/differences-between-strong-and-weak-in-objective-c
'programing' 카테고리의 다른 글
Git: 로컬 변경을 실행 취소할 수 없습니다(오류: 경로...가 병합되지 않음). (0) | 2023.05.01 |
---|---|
WPF 사용자 컨트롤 배치 (0) | 2023.05.01 |
로컬 Git 변경을 제거하는 다양한 방법 (0) | 2023.04.26 |
git를 사용하여 푸시된 커밋을 취소하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
Swift에서 "신고되지 않은 유형의 사용", 유형이 내부이고 동일한 모듈에 존재하는 경우 (0) | 2023.04.26 |