ARC를 사용하고 iOS 4.0을 대상으로 할 때 약한 참조를 어떻게 대체합니까?
Xcode 4.2로 첫 번째 iOS 앱을 개발하기 시작했고 "유틸리티 애플리케이션"템플릿 (FlipsideViewController와 함께 제공되는 템플릿)으로 iOS 5.0을 대상으로했습니다.
ARC는 컴파일 타임 기능이기 때문에 iOS 4 와도 호환되어야한다고 읽었으므로 앱을 4.3으로 타겟팅하고 컴파일을 시도했습니다. 이렇게하면 다음 오류가 발생합니다.
FlipsideViewController.m : 오류 : 자동 참조 계산 문제 : 현재 배포 대상이 자동화 된 __weak 참조를 지원하지 않습니다.
다음 줄을 참조하고 있습니다.
@synthesize delegate = _delegate;
해당 변수는 다음과 같이 선언됩니다.
@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;
나는 "약한 참조"가 iOS 4에서 지원되지 않는다는 것을 이해하지만, 왜 약한 참조를 사용하여 시작해야하는지 이해하지 못하며, 사용을 피하기 위해 어떻게 다시 작성해야하는지 알 수 없습니다. 여전히 ARC를 활용하고 있습니다 (결국 iOS 4 및 5에서 작동해야합니다.)
이전 OS를 대상으로하려면 속성 선언 unsafe_unretained
대신 사용할 수 weak
있으며 대부분 동일한 방식으로 작동해야합니다. weak
타겟이 사라지면 nil 자체를 참조하지만 unsafe_unretained
연결하려는 객체가 할당 해제 될 때 댕글 링 포인터로 바뀔 가능성이 있습니다. 후자는 assign
수동 메모리 관리에서 속성 선언으로 사용한 것과 동일한 동작 입니다.
여기 에 내 대답 에서 언급 한 유지주기를 피하기 위해 이렇게합니다 . 원래 개체에 대한 강력한 포인터가있을 수있는 항목에 대한 강력한 포인터를 원하지는 않습니다. 그러면 아무것도 제대로 해제되지 않습니다.
추가 안전을 위해 약한 참조 만 사용하는 경우 사용 가능한 경우 새 런타임 함수를 수동으로 호출하고 __unsafe_unretained
그렇지 않은 경우 변수 에 대한 단순 할당으로 대체합니다 .
ZWRCompatibility.h 는 이것을 다소 단순화합니다.
Mike Ash의 호환성 라이브러리 PLWeakCompatibilty 덕분에 이제 iOS 4.x에서도 간단히 __weak을 사용할 수 있습니다.
구성이 매우 쉬우 며 5.x보다 추가 고려 사항이나 노력이 필요하지 않습니다.
'Programing' 카테고리의 다른 글
Graph API를 사용하는 Facebook 'Friends.getAppUsers' (0) | 2020.09.12 |
---|---|
State, ST, IORef 및 MVar의 차이점 (0) | 2020.09.12 |
node.js에서 쉘 명령의 출력을 실행하고 가져옵니다. (0) | 2020.09.12 |
Microsoft.DotNet.Props를 찾을 수 없습니다. (0) | 2020.09.12 |
Visual Studio 2017 및 C # 7.0을 사용하는 메서드에서 Tuple을 반환 할 수 없습니다. (0) | 2020.09.12 |