IT

Objective-C의 약하고 강력한 속성 setter 속성

lottoking 2020. 8. 29. 12:54
반응형

Objective-C의 약하고 강력한 속성 setter 속성


Objective-C에서 약한 속성 설정자 속성과 강력한 속성 설정 기 속성의 차이점은 무엇입니까?

@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;

영향과 이점은 무엇입니까?

iOS 4에서는 약한 기능을 사용할 수 있습니다.

약한 할당과 할당은?


특정 파일에 대해 ARC를 켜거나 끕니다. 안정되어 retain release autorelease등을 사용할 수 없습니다 . 대신 strong weak속성 또는 __strong __weak 변수에 사용 합니다 __strong. Strong은 유지하는 것과 동일하지만 ARC가 릴리스를 관리합니다.

약한 것을 사용하고 싶은 유일한 경우는 유지주기를 피하려는 경우입니다 (예 : 부모가 부모를 유지하고 유지하고 업데이트되지 않음).

'수신자 부담 전화 브리지'부분 (에서 NS으로 캐스팅 CF)은 약간 까다 롭습니다. 은 수동으로 당신 관리해야 우리 CFRelease()하고 CFRetain()CF 개체를합니다. 제공을 다시 NS로 변환 할 때 컴파일러에게 당신이 무엇을했는지 알 수 있습니다 리 테인에서 알려야합니다.

모두 여기에 있습니다 .


다음은 변수 속성에 대해 알고있는 정보입니다.

  1. 원자 //
  2. 비 원자
  3. strong = 보유 //
  4. 약한
  5. 유지
  6. // 기본 할당
  7. unsafe_unretained
  8. 읽기 전용
  9. 읽기 / 쓰기 //

그래서 아래는 언급 된 모든 속성을 참조 링크입니다. 최고의 답변을 주신 모든 분들께 감사드립니다 !!

iOS의 변수 속성 속성 또는 수정 자

01. 강함 (iOS4 = 유지) - "더 이상 가리 키지 않을 때까지 힙에 보관"이라고 표시됩니다. 다시 말해서 "나는 소유자입니다. 조준하기 전에 할당을 해제 할 수 없습니다."-개체를 유지해야하는 경우에만 강함을 사용합니다. -기본적으로 모든 인스턴스 변수와 지역 변수는 강력한 포인터입니다. -우리는 일반적으로 UIViewControllers (UI 항목의 부모)에 대해 강력하게 사용합니다. -strong은 ARC와 함께 사용하여 기본적으로 오브젝트의 보유 수에 대해 걱정할 필요가 있습니다. ARC는 작업이 자동으로 해제됩니다. strong 키워드를 사용하면 해당 개체를 소유하고 있음을 의미합니다.

예 :

@property (strong, nonatomic) ViewController *viewController;

@synthesize viewController;

02. weak (iOS4 = unsafe_unretained) - "다른 사람이 강하게 한 유지"라고 표시됩니다 .- 할당, 유지 또는 해제와 동일합니다 .- "약한"참조는 유지하지 않는 참조입니다. -우리는 일반적으로 IBOutlets (UIViewController의 Childs)에 약한 것을 사용합니다. 이것은 한만 존재하면되기 때문에 작동합니다. -약한 참조는 참조 된 개체를 가비지 수집기의 수집으로부터 보호하지 않는 참조입니다. -약함은없는 것으로 유지되지 않는 재산입니다. 객체가 할당 해제 된 경우 제외하고 약한 포인터는 자동으로 nil로 설정됩니다.

예 :

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

@synthesize myButton;

설명 : BJ Homer 덕분에

우리의 존재가 개이고 그 개가 도망 치고 싶어 해제 상상해 (할당 해제 됨). 강력한 포인터는 강아지의 끈과 가변적입니다. 개에 목줄이 정리 된 한 개는 도망 가지 않습니다. 5 명이 한 마리의 개에게 가죽 끈을 붙이면 (한계에 5 개의 강한 포인터), 다섯 마리의 가죽 끈이 모두 분리 될 때까지 개는 도망 가지 언어로됩니다. 반면에 약한 포인터는 어린 아이가 개를 가리키며 "봐! 개!"라고 말하는 것입니다. 개가 여전히 목줄에있는 한 어린 아이들은 여전히 ​​개를 볼 수 있고 여전히 개를 가리킬 것입니다. 그러나 모든 목줄이 분리 되 자마자 얼마나 많은 어린 아이들이 그것을 가리키고 있더라도 분리 되니. 마지막 강력한 포인터 (끈)가 더 이상 개체를 가리 키지 해당 개체는 할당 해제되고 약한 포인터는 0이됩니다. 약한 것을 사용할 때? 약한 것을 사용하고 싶은 유일한 경우는 유지주기를 피하려는 경우입니다 (예 : 부모가 부모를 유지하고 유지하고 업데이트되지 않음).


마지막 두 가지 질문에 명시 적으로 대답하는 Robert가 참조한 문서의 일부를 호출 다음을 수행하십시오.

// The following declaration is similar to "@property(assign) MyClass *myObject;"
// except that if the MyClass instance is deallocated,
// the property value is set to nil instead of remaining as a dangling pointer.
@property(weak) MyClass *myObject;

이를 제로화 약한 참조라고합니다. __unsafe_unretained를 사용하여 약한 참조를 제로화하지 않는 약한 참조를 만들 수 없습니다.

또한 문서에서 :

Weak references are not supported in Mac OS X v10.6 and iOS 4.

WEAK 속성의 명확한 사용은 다음과 가변합니다.

Any control whose properties we need to change(eg:text of a label) is declared weak and as below:

@property(nonatomic,weak) IBOutlet Type *name;
Eg: @property(nonatomic,weak) IBOutlet UILabel *myLabel;

더 자세히 설명하기 위해 예를 들어 보겠습니다 (위의 답변은 이미 훌륭합니다),이 예가 조금 더 도움이 될 수 있습니까?

클래스 A와 B를 두 개

//A.h

#import <Foundation/Foundation.h>
#import "B.h"

@interface A : NSObject

@property (nonatomic, strong) B *objB;

@end

@implementation A
//

@end

//B.h

    #import <Foundation/Foundation.h>
    #import "A.h"


    @interface B : NSObject

    @property strong text(nonatomic, strong) A *objA;

    @end

    @implementation B
    //

    @end

    and in main

    #import "B.h"
    #import "A.h"

    {
    A *obja =[[A alloc]init];
    B *objb =[[B alloc]init];
    A.objB=objb;
    B.objA=obja;
   }

위 코드는 둘 다 강력한 유형 a --------> b ---------> a이기 때문에 유지주기를 생성합니다.

그래서 그것을 피하기 위해 당신은 그것 중 하나의 주 속성을 사용하여 매주 개체를 참조하고 참조 횟수를 늘리지 않도록해야합니다.

참고 URL : https://stackoverflow.com/questions/7912555/weak-and-strong-property-setter-attributes-in-objective-c

반응형