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로 변환 할 때 컴파일러에게 당신이 무엇을했는지 알 수 있습니다 리 테인에서 알려야합니다.
모두 여기에 있습니다 .
다음은 변수 속성에 대해 알고있는 정보입니다.
- 원자 //
- 비 원자
- strong = 보유 //
- 약한
- 유지
- // 기본 할당
- unsafe_unretained
- 부
- 읽기 전용
- 읽기 / 쓰기 //
그래서 아래는 언급 된 모든 속성을 참조 링크입니다. 최고의 답변을 주신 모든 분들께 감사드립니다 !!
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이기 때문에 유지주기를 생성합니다.
그래서 그것을 피하기 위해 당신은 그것 중 하나의 주 속성을 사용하여 매주 개체를 참조하고 참조 횟수를 늘리지 않도록해야합니다.
'IT' 카테고리의 다른 글
xs : NCName 유형은 무엇이며 언제 언제 사용합니까? (0) | 2020.08.29 |
---|---|
VirtualBox Vagrant 내에서 Mysql Server에 연결하는 방법은 무엇입니까? (0) | 2020.08.29 |
새 줄 또는 탭을 만드는 방법 (0) | 2020.08.29 |
제목 대소 문자로 변환 (0) | 2020.08.29 |
Android 아이콘 대 로고 (0) | 2020.08.28 |