Objective-C의 강점과 약점의 차이점


308

저는 Obj-C를 처음 사용하므로 첫 번째 질문은 다음과 같습니다.

의 차이점은 무엇입니까 strongweak@property객체에 대한 포인터의 선언은?

또한 무엇을 nonatomic의미합니까?


19
실제로 때때로, 우리는 / STRONG 약한 원자 / 세분화 환경 설정의 기본 개념은 ... : ... 그것에 대해 우리에게 상기시켜 주셔서 감사 방법을 잊고, 좋은 질문입니다
andikurnia

10
@JackyBoy 재미있는 점은 Google에서 제안 된 간단한 검색이 나를 여기로 안내한다는 것입니다. #circularreference
Jason Renaldo

10
나는 구글에 대한 많은 답변을 믿지 않는 경향이 있지만 항상 지능적인 답변을 위해 SO를 참조하십시오
JeffK

답변:


641

강력한 참조 (대부분의 경우에 사용됨)는이 속성 / 변수를 참조하는 개체를 "소유"하고자 함을 의미합니다. 컴파일러는이 속성에 할당 한 객체가 강력한 참조로 가리키고있는 한 파괴되지 않도록주의합니다. 속성을 한 번만 설정하면 nil객체가 손상됩니다 (하나 이상의 다른 객체가 객체를 강력하게 참조하지 않는 한).

대조적으로, 약한 참조로 객체의 수명을 제어하고 싶지 않다는 것을 나타냅니다. 약하게 참조하는 객체는 적어도 하나의 다른 객체가 그것에 대한 강한 참조를 가지고 있기 때문에 계속 존재합니다. 이것이 더 이상 적용되지 않으면 객체가 파괴되고 약한 속성이 자동으로 설정됩니다 nil. iOS에서 약한 참조의 가장 빈번한 사용 사례는 다음과 같습니다.

  1. 유지주기를 피하기 위해 종종 약하게 참조되는 위임 속성

  2. 뷰 컨트롤러의 메인 뷰의 서브 뷰 / 컨트롤은 해당 뷰가 이미 메인 뷰에 의해 강력하게 유지되어 있기 때문입니다.

atomic 대 nonatomic은 컴파일러가 속성에 대해 합성하는 getter 및 setter 메서드의 스레드 안전성을 나타냅니다. atomic (기본값)은 컴파일러에 접근 자 메소드를 스레드로부터 안전하게 설정하고 (ivar에 액세스하기 전에 잠금을 추가하여) 비원 자적으로 반대입니다. 비원 자의 장점은 약간 더 높은 성능입니다. iOS에서 Apple은 거의 모든 속성에 비원자를 사용하므로 일반적인 조언은 동일한 작업을 수행하는 것입니다.


28
@ Bourne : 스레드 안전의 의미에 따라 다릅니다. atomic것을 보장 속성이 안전하게 읽고 동시에 여러 스레드에서 쓸 수 있습니다. 그렇다고 모든 속성 atomic이 자동으로 스레드로부터 안전하다는 의미는 아닙니다 .
올레 Begemann

3
훌륭한 세부 사항. 나는 지금까지 그것을 실제로 얻지 못했다고 생각합니다. 감사합니다.
ahmedalkaff

1
Apple 문서에 따라 원자 및 비 원자 스레드는 스레드 안전성과 동의어 여야합니다. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Murtaza Khursheed Hussain

5
"참고 : 속성 원자 성은 객체의 스레드 안전성과 동의어가 아닙니다." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS

왜 원하지 않을 때 인스턴스를 삭제하지 않습니까? 왜 우리가 풍선에서 공기를 꺼내거나 원하지 않을 때 공기를 제거 할 수없는 이유는 무엇입니까? 데이터 만 있으면됩니다.
Ashish Pisey

706

풍선의 관점에서 강하고 약한 참조에 대해 생각하는 것이 도움이 될 수 있습니다.

풍선에 부착 된 끈을 한 명 이상 잡고 있으면 풍선이 날아 가지 않습니다. 줄을 들고있는 사람의 수는 유지 횟수입니다. 아무도 끈을 잡고 있지 않으면 ballon이 날아갑니다 (dealloc). 많은 사람들이 같은 풍선에 줄을 가질 수 있습니다. 강한 참조와 약한 참조를 모두 사용하여 참조 된 객체에서 속성을 가져 오거나 설정할 수 있습니다.

강한 참조는 풍선에 끈을 붙잡고있는 것과 같습니다. 풍선에 부착 된 끈을 잡고있는 한 날아 가지 않습니다.

약한 참조는 풍선을 보는 것과 같습니다. 볼 수 있고, 속성에 액세스하고, 메서드를 호출하지만 해당 풍선에 문자열이 없습니다. 줄을 잡고있는 모든 사람이 갈 수 있으면 풍선이 날아가서 더 이상 액세스 할 수 없습니다.


68
+2 (만 가능하다면). 정말 창의적인 설명입니다!
Con Antonakos

25
1 년 반 동안 iOS를 개발 한 후, 저는 지금 무엇 strongweak의미 하는지 실제로 이해하고 있다고 생각 합니다.
Isuru

17
@ X.Li 리 테인 사이클은 ballon에 2 개의 현이 있고, 그중 하나는 당신이 소유하고 (따라서 당신은이 ballon을 소유합니다), 다른 하나는 ballon이 소유합니다 (이 ballon은 당신을 소유합니다). 당신이 당신의 줄에만 접근 할 수 있기 때문에, ballon이 가고 싶지 않다면 어떻게 ballon을 보내 게합니까? 따라서 ballon이 당신을 소유하지 않는 (약한) ballon을 소유하는 것이 좋습니다. 당신이 그것을 놓아두고 싶을 때, 그냥 문자열을 잘라 :)
snakeninny

5
그의 프로필을 읽고, 그는 iOS 강사입니다. 매우 창의적인 설명 !! Hats Off :)
Hemang

3
원자 대 비 원자 나는 여러 개의 문이 있고 화장실이 중앙에있는 공중 화장실로 묘사 될 수 있다고 생각합니다. 누군가가 한 문을 통해 화장실에 들어가면, 어색한 순간을 원하지 않는다면 다른 모든 문을 화장실에 잠글 수도 있습니다. 롤 이 넌센스 비유를 읽어 주셔서 감사합니다.
Chen Li Yong

24

strong : 들어오는 값을 할당합니다. 들어오는 값을 유지하고 인스턴스 변수의 기존 값을 해제합니다

weak : 들어오는 값을 유지하지 않고 할당합니다.

기본적인 차이점은 새로운 변수를 유지하는 것입니다. 일반적으로 유지하려고하지만 유지하지 않으려는 경우가 있습니다. 그렇지 않으면 유지 주기가되어 메모리 객체를 해제 할 수 없습니다. 예 : obj1은 obj2를 유지하고 obj2는 obj1을 유지합니다. 이러한 상황을 해결하려면 약한 참조를 사용하십시오.


12

더미 답변 :-

나는 위의 답변에 설명이 있다고 생각하므로 어디에서 사용해야 STRONG하고 어디에서 사용 해야하는지 말할 것입니다 WEAK.

의 사용 Weak: - 1. 대표 2. 콘센트 3. 서브 뷰 4. 제어 등

사용 Strong:-에 포함되지 않은 모든 곳에 남아 있습니다 WEAK.


2
그리고 무엇을 포함 하는가 : P
Rajneesh071

3
webView, mapView 등
shubham mishra

4
실제로 우리가 스토리 보드에서 끌어다 놓는 대부분의 하위 견해
shubham mishra

8

강력한약한 주변에 이러한 키워드가 공전 객체 소유 목표 - C에서

객체 소유권이란 무엇입니까?

포인터 변수는 그들이 가리키는 객체의 소유권을 의미합니다.

  • 메소드 (또는 함수)에 객체를 가리키는 로컬 변수가 있으면 해당 변수는 가리키는 객체를 소유한다고합니다.
  • 객체에 다른 객체를 가리키는 인스턴스 변수가있는 경우 포인터가있는 객체는 가리키는 객체를 소유한다고합니다.

포인터 변수가 객체를 가리킬 때마다 해당 객체에 소유자가 있으며 계속 유지됩니다. 이것은 강력한 참조 로 알려져 있습니다.

변수는 선택적으로 객체의 소유권을 가질 수 없습니다. 객체의 소유권을 가지지 않는 변수를 약한 참조라고합니다.

자세한 설명을 보려면 여기에서 @property 및 속성을 이해하십시오.


6

여기에서 Apple Documentation 은 다양한 예제를 사용하여 약한 속성과 강한 속성의 차이점을 설명했습니다.

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

여기,이 블로그에서 저자는 모든 장소를 같은 장소에 모았습니다. 속성 특성을 비교하는 데 도움이됩니다.

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


6

strong 이 기본값입니다. 개체에 대한 강력한 포인터가있는 한 개체는 "생존"상태로 유지됩니다.

weak 는 참조 된 개체를 유지하지 않는 참조를 지정합니다. 객체에 대한 강한 참조가없는 경우 약한 참조는 nil로 설정됩니다.


2

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에 도달 할 때까지 변수가 할당 해제되지 않습니다.

도움이 되었기를 바랍니다.


2019-07-25 12 : 33 : 15.479002 + 0530 StrongAndWeak [6329 : 245483] 제 이름은 = ABC 2019-07-25 12 : 33 : 15.479226 + 0530 StrongAndWeak [6329 : 245483] 제 이름은 강력합니다 = ABC 2019- 07-25 12 : 33 : 15.479418 + 0530 StrongAndWeak [6329 : 245483] 내 이름은 약하다 = ABC는 약한 속성은 myname 값이 없다고 말했지만 myname 값은 ABC로 받고있다. ..? 당신은 더 명확한 대답을 줄 수 있습니까? ... 사전에 감사드립니다
Madhu_Nani

@Raviteja_DevObal ARC는 즉시 그것을 할 것을 약속하지는 않지만 (즉, 문자열 ""ABC "를 할당 해제) 나중에 할당을 해제 할 것입니다 ...
Mahadev Mandale

@Raviteja_DevObal 여기에서 설명하는 것처럼 문자열은 이에 대한 나쁜 예입니다. UIView 객체로 답변을 업데이트했습니다. 도움이되기를 바랍니다.
Mahadev Mandale

1

강력 함 : 기본적으로 사용되는 속성으로 데이터를 가져 오거나 다른 클래스로 전송하는 데 사용했습니다. 약점 : 일반적으로 모든 콘센트, 연결부는 인터페이스의 약한 유형입니다.

Nonatomic : 이러한 유형의 속성은 콘센트 또는 객체를 서로 다른 동시 스레드로 공유하지 않으려는 조건에서 사용됩니다. 즉, Nonatomic 인스턴스는 한 번에 하나의 스레드를 처리하도록 속성을 만듭니다. 잘하면 그것은 당신에게 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.