Programing

ARC를 사용하고 iOS 4.0을 대상으로 할 때 약한 참조를 어떻게 대체합니까?

crosscheck 2020. 9. 12. 09:08
반응형

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보다 추가 고려 사항이나 노력이 필요하지 않습니다.

참고 URL : https://stackoverflow.com/questions/6893038/how-do-i-replace-weak-references-when-using-arc-and-targeting-ios-4-0

반응형