bestsource

목표-CARC: 강함 vs 유지, 약함 vs 할당

bestsource 2023. 5. 14. 10:48
반응형

목표-CARC: 강함 vs 유지, 약함 vs 할당

ARC에서에 대한 두 메모리 인 ARC는 .strong그리고.weak.

▁▁apart을외.copy그것은 분명히 완전히 다른 것입니다, vs와 vs 사이에 어떤 차이가 있습니까?

제가 아는 한, 여기서 유일한 차이점은weak할당할 것입니다.nil 포터로동, 는안러그.assign그렇지 않습니다. 즉, 포인터가 해제되면 포인터에 메시지를 보낼 때 프로그램이 충돌합니다.하지만 내가 사용한다면,weak이런 일은 절대 일어나지 않을 것입니다, 왜냐하면 메시지가 전송되기 때문입니다.nil아무 것도 안 할 겁니다

사이에 어떤 차이점이 있는지 모르겠습니다.strong그리고.retain.

가 가제사하이있나요유가는야용해?있을 사용해야 하는 이유가 있나요?assign그리고.retain새로운 프로젝트에서, 또는 그런 종류의 것이 사용되지 않는 것입니까?

너무 많은 기사를 읽은 후 변수 속성을 확인하기 위해 오버플로 게시물과 데모 응용 프로그램을 스택하여 모든 속성 정보를 결합하기로 결정했습니다.

  1. 원자 //기본값
  2. 원자가 아닌
  3. strong=filename //기본값
  4. 약한
  5. 유지하다
  6. //기본값 할당
  7. 안전하지 않은
  8. 알았다.
  9. 읽기 전용
  10. 읽기 쓰기 //기본값

다음은 위에서 언급한 모든 속성을 확인할 수 있는 자세한 기사 링크입니다.여기서 최고의 답변을 해주신 모든 분들께 감사드립니다!!

iOS의 변수 속성 또는 수정자

1.strong(iOS4 = 유지)

  • "내가 더 이상 지적하지 않을 때까지 이것을 더미 속에 보관"이라고 쓰여 있습니다.
  • 다른 말로 하면, "나는 소유자입니다, 당신은 보유와 동일한 것을 목표로 하기 전에 이것의 할당을 해제할 수 없습니다."
  • 개체를 유지해야 할 경우에만 strong을 사용합니다.
  • 기본적으로 모든 인스턴스 변수와 로컬 변수는 강력한 포인터입니다.
  • 일반적으로 UIViewController(UI 항목의 상위 항목)에 대해 강력하게 사용합니다.
  • strong은 ARC와 함께 사용되며 기본적으로 객체의 보유 개수에 대해 걱정하지 않아도 됩니다.ARC는 작업이 끝나면 자동으로 해제합니다.키워드 strong을 사용하면 개체를 소유하게 됩니다.

예:

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

2.약함 -

  • 그것은 "다른 사람이 강하게 가리키는 한 이것을 유지하라"고 말합니다.
  • 할당, 보유 또는 해제와 동일한 것
  • "약한" 참조는 보유하지 않는 참조입니다.
  • 우리는 일반적으로 IBOutlet(UIViewController's Childs)에 약한 것을 사용합니다.자식 개체는 부모 개체만큼만 존재하면 되기 때문에 작동합니다.
  • 약한 참조는 참조된 개체를 가비지 수집기에 의한 수집으로부터 보호하지 않는 참조입니다.
  • 약한 것은 기본적으로 할당되고 유지되지 않는 속성입니다.개체의 할당이 취소되면 약한 포인터가 자동으로 0으로 설정됩니다.

예:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

@synthesize myButton;

BJ Homer 덕분에 강하고 약한 설명:

우리의 대상이 개라고 상상해 보세요. 그리고 그 개가 도망치고 싶어한다고 생각해 보세요).

강한 포인터는 개의 목줄과 같습니다.개에게 목줄이 붙어 있는 한, 개는 도망가지 않을 것입니다.만약 다섯 명이 한 마리의 개에게 그들의 목줄을 붙이면, 그 개는 다섯 개의 목줄이 모두 분리될 때까지 달아나지 않을 것입니다.

반면에 약한 포인터는 어린 아이들이 개를 가리키며 "이것 봐!"라고 말하는 것과 같습니다.개!"개가 아직 목줄에 묶여 있는 한, 어린 아이들은 여전히 개를 볼 수 있고, 그들은 여전히 그것을 가리킬 것입니다.하지만, 모든 끈이 분리되자마자, 그 개는 아무리 많은 어린 아이들이 그것을 가리켜도 달아납니다.

마지막 강한 포인터(레쉬)가 더 이상 개체를 가리키지 않는 즉시 개체의 할당이 취소되고 모든 약한 포인터가 0으로 표시됩니다.

약한 거 쓸 때?

약한 사용을 원하는 유일한 경우는 유지 주기를 방지하려는 경우입니다(예: 부모는 자녀를 유지하고 자녀는 부모를 유지하므로 둘 다 해제되지 않음).

3.강력 = 강함

  • 유지되고, 이전 값이 해제되며, 할당된 유지는 새 값을 전송해야 함을 지정합니다.
  • 할당 시 보유 및 이전 값 전송 - 릴리스
  • 보유는 강한 것과 같습니다.
  • Apple은 쓰기 유지가 유지되면 자동으로 변환/강력하게만 작동한다고 말합니다.
  • "alloc"와 같은 방법에는 암묵적인 "message"가 포함됩니다.

예:

@property (nonatomic, retain) NSString *name;

@synthesize name;

4.1987년

  • assign이 기본값이며 단순히 변수 할당을 수행합니다.
  • assign은 컴파일러에게 속성의 세터 구현을 합성하는 방법을 알려주는 속성 속성입니다.
  • 나는 C 기본 속성에 할당하고 Objective-C 객체에 대한 약한 참조에 약한 속성에 할당할 것입니다.

예:

@property (nonatomic, assign) NSString *address;

@synthesize address;

Transitioning to ARC 릴리스 노트(속성 속성 섹션의 예).

// The following declaration is a synonym for: @property(retain) MyClass *myObject;

@property(strong) MyClass *myObject;

그렇게strong는 와동합다니와 .retain재산 신고서에

ARC 프로젝트의 경우 사용할 수 있습니다.strongretain나는 사용할 것입니다.assign 및 C 시원경우및의속에 weakObjective-C 객체에 대한 약한 참조.

원자가 아닌

  • 원자가 아닌 것이 원자보다 훨씬 빠릅니다.
  • 드물어야 하는 원자에 대한 매우 구체적인 요구 사항이 없는 한 항상 원자가 아닌 것을 사용합니다(원자는 스레드 안전을 보장하지 않습니다. 다른 스레드에 의해 동시에 설정될 때만 속성에 액세스할 수 있습니다).

강한/약한/약한

  • 개체를 유지하려면 strong 사용 - 키워드 retain이 동의어이지만 대신 strong을 사용하는 것이 가장 좋습니다.
  • 개체를 유지하지 않고 개체에 대한 포인터만 원하는 경우 약한 포인터 사용 - 유지 주기(즉, 대리인)를 피하는 데 유용 - 개체를 해제하면 포인터가 자동으로 영점 처리됩니다.
  • 기본값에 할당 사용 - 해제할 때 개체를 실행하지 않는 것을 제외하고는 약한 것과 정확히 같습니다(기본값으로 설정).

(선택사항)

알았다.

  • 개체의 얕은 복사본을 만드는 데 사용합니다.
  • 항상 복사할 불변 속성을 설정하는 모범 사례 - 가변 버전은 불변 속성으로 전달될 수 있기 때문에 복사는 항상 불변 개체를 처리하도록 보장합니다.
  • 불변 객체가 전달되면 해당 객체가 유지됩니다. 가변 객체가 전달되면 해당 객체를 복사합니다.

읽기 전용

  • 속성 설정을 비활성화하는 데 사용합니다(위반이 있는 경우 코드를 컴파일할 수 없음).
  • 인스턴스 변수를 통해 직접 변수를 변경하거나 getter 메서드 자체 내에서 변수를 변경하여 getter가 제공하는 내용을 변경할 수 있습니다.

제가아한는,한는▁as,strong그리고.retain동의어이기 때문에 정확히 같은 행동을 합니다.

에 그면러그.weak와 거의 같습니다.assign그러나 개체가 가리키는 할당이 해제된 후에는 자동으로 0으로 설정됩니다.

즉, 간단히 교체할 수 있습니다.

하지만, 제가 마주친 특별한 경우가 하나 있는데, 그곳에서 제가 사용해야 했습니다.assign에, 다는보는weak가 두 가지 있다고 delegateAssign그리고.delegateWeak두 가지 모두에 우리의 대리인이 저장되어 있는데, 그것은 유일한 강력한 참조를 가짐으로써 우리를 소유하고 있는 것입니다.을 해제하고 우리의 대리이할있으로므고,인.-dealloc메서드도 호출됩니다.

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething];
    [delegateAssign doSomething];
}

대리자가 이미 할당 취소 프로세스에 있지만 완전히 할당 취소되지는 않았습니다.문제는 그에 대한 언급이 이미 무효화되었다는 것입니다!소유물delegateWeak하지만 0을 포함합니다.delegateAssign유효한 개체가 포함되어 있습니다(모든 속성이 이미 릴리스되고 무효화되었지만 여전히 유효함).

// Our delegate is deallocating and there is no other strong ref.
- (void)dealloc {
    [delegateWeak doSomething]; // Does nothing, already nil.
    [delegateAssign doSomething]; // Successful call.
}

꽤 특별한 경우지만, 어떻게 그것들이weak변수가 작동하고 언제 무효화되는지 확인합니다.

Clang의 목표-C 자동 참조 계수(ARC) 문서는 소유권 한정자와 수식어를 명확하게 설명합니다.

네 가지 소유권 자격이 있습니다.

  • __자동 해제
  • __강력한
  • __*contained_unstained*
  • __약한

유형이 __autoreleasing, __strong 또는 __weak으로 검증된 경우 소유권이 제한되지 않습니다.

선언된 속성에는 다음과 같은 6개의 소유권 수식자가 있습니다.

  • 할당은 __*proxy_unretained* 소유권을 의미합니다.
  • copy__strong 소유권뿐만 아니라 세터에서 copy 의미론의 일반적인 동작을 암시합니다.
  • retain은 __strong 소유권을 의미합니다.
  • strong은 __strong 소유권을 의미합니다.
  • *filename_unretained*는 __*filename_unretained* 소유권을 의미합니다.
  • weak는 __weak 소유권을 의미합니다.

약한 경우를 제외하고 이러한 수식어는 비 ARC 모드에서 사용할 수 있습니다.

의미론적으로 소유권 한정자는 읽기, 할당, 초기화, 파괴 및 이동의 다섯 가지 관리 작업에서 서로 다른 의미를 갖습니다. 이 작업에서는 대부분 할당 작업의 차이에만 관심이 있습니다.

할당 연산자를 평가할 때 할당이 발생합니다.의미론은 자격에 따라 달라집니다.

  • __strong 객체의 경우 먼저 새 점이 유지되고, 두 번째로 l값이 원시 의미로 로드되며, 세 번째로 새 점이 원시 의미로 l값에 저장되고, 마지막으로 이전 점이 해제됩니다.이 작업은 원자적으로 수행되지 않으며, 동시 로드 및 저장 시 외부 동기화를 사용하여 안전하게 수행해야 합니다.
  • __weak objects의 경우, 새 포인터가 현재 할당 해제 중인 개체가 아닌 경우, l 값이 null 포인터로 업데이트됩니다.이 작업은 개체에 대한 다른 할당, 개체에서 읽기 및 새 포인터의 최종 릴리스와 관련하여 원자적으로 실행되어야 합니다.
  • __*unsafe_unretained* 객체의 경우 새 점은 원시 의미론을 사용하여 l 값에 저장됩니다.
  • __autoreleasing 객체의 경우 새 점이 유지되고, 자동으로 해제되며, 원시 의미론을 사용하여 l 값에 저장됩니다.

Reading, Init, Destruction 및 Moving의 다른 차이점은 문서의 섹션 4.2 Semantics를 참조하십시오.

Strong 및 Weak 참조를 이해하려면 아래의 예를 참조하십시오. displayLocalVariable이라는 이름의 메서드가 있다고 가정합니다.

 -(void)displayLocalVariable
  {
     NSString myName = @"ABC";
     NSLog(@"My name is = %@", myName);
  }

위의 메서드에서 myName 변수의 범위는 LocalVariable 메서드를 표시하도록 제한됩니다. 메서드가 완료되면 "ABC" 문자열을 보유하고 있는 myName 변수가 메모리에서 할당 해제됩니다.

이제 뷰 컨트롤러 수명 주기 동안 myName 변수 값을 유지하려면 어떻게 해야 합니까?이를 위해 변수 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" 문자열에 대한 강한 참조)를 가지고 있음을 알 수 있습니다.따라서 string myName은 self.username이 활성화될 때까지 메모리에서 할당 해제되지 않습니다.

  • 약한 참조

이제 약한 참조인 dummyName에 myName을 할당하는 것을 고려해 보십시오.dummyName = 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, 즉 self에 대한 강한 참조를 가지고 있습니다.method가 종료된 후에도 myName에 strong 참조가 연결되어 있으므로 dummyName의 값이 있습니다.

이제 변수에 대해 강한 참조를 할 때마다 유지 카운트가 1씩 증가하고 변수는 할당 해제된 유지 카운트가 0에 도달하지 않습니다.

이게 도움이 되길 바랍니다.

강함:

  • 속성은 삭제되지 않지만 속성을 0으로 설정한 후에만 개체가 삭제됩니다.
  • 기본적으로 모든 인스턴스 변수와 로컬 변수는 강력한 포인터입니다.
  • 개체를 유지해야 할 경우에만 strong을 사용합니다.
  • 일반적으로 UIViewController(UI 항목의 상위 항목)에 대해 강력하게 사용합니다.
  • IOS 4(비ARC) Retain KeyWord를 사용할 수 있습니다.
  • 강력한 키워드를 사용할 수 있는 IOS 5(ARC)

예: @property(강력한, 원자가 아닌) ViewController *viewController;

@view 컨트롤러 합성;

약한

기본적으로 자동으로 가져오기 및 0으로 설정

  • 우리는 일반적으로 IBOutlet(UIViewController's Childs)에 약한 것을 사용하고 위임합니다.
  • 할당, 보유 또는 해제와 동일한 것

예: @property(취약, 비원자) IBOutlet UIButton *myButton;

@내 단추를 합성합니다;

강한 것과 유지하는 것의 차이점:

  • iOS4에서 강한 것은 유지하는 것과 같습니다.
  • 즉, 개체를 소유하고 더 이상 가리키지 않을 때까지 힙에 보관합니다.
  • 만약 당신이 보존을 쓴다면 그것은 자동적으로 강력하게 작동할 것입니다.

약한 것과 할당하는 것의 차이점:

  • "약한" 참조는 다른 사람이 강하게 가리키는 한 유지하지 않고 유지하는 참조입니다.
  • 개체가 "할당 취소"되면 약한 포인터가 자동으로 0으로 설정됩니다.
  • "assign" 속성 속성은 컴파일러에게 속성의 세터 구현을 합성하는 방법을 알려줍니다.

언급URL : https://stackoverflow.com/questions/8927727/objective-c-arc-strong-vs-retain-and-weak-vs-assign

반응형