Swift가 Obj-C 용으로 생성하는 헤더 파일은 Obj-C 코드에서 ARC가 사용되고 있다고 가정합니다. Xcode 버전 및 빌드 설정에 따라 속성이 암시 적으로 assign
-property 일 때마다 경고하는 경고가 활성화되어있을 수 있습니다.이 속성은 ARC 코드와 같이 비 ARC 코드에서만 발생하며 속성은 암시 적으로 strong
입니다. 비 ARC 코드에서 retain
과 정확히 동일). 해당 경고가 활성화되면 생성 된 헤더를 ARC가 아닌 .m 파일로 가져올 때마다 경고 메시지가 표시되고 Swift는 해당 속성에 대한 저장 속성을 설정하지 않습니다.
그러나 경고는 나중에 컴파일 된 코드가 제대로 작동하지 않음을 의미하지 않습니다. 컴파일러는 weak
-Properties가 될! 그들은 strong
수 있습니다 또는이 weak
(weak
가 assign
과 동일하지 않습니다 될 수 있으며,이 건물은이 assign
같은 스위프트 특성도 assign
하지 않을 수 없을 확실히 않습니다 만 assign
믿고 있다는 사실에도 불구하고 nil
개체가 죽으면 assign
-properties가 포인터를 매달고 여전히 개체가 살던 데 사용 된 주소를 가리 킵니다. 경고에도 불구하고이 상황이 발생할 수있는 최악의 상황은 잘못된 정적 코드 분석기 결과입니다.이 assign
-property가 코드를 손상시킬 수 있고 다시 분석기가 실수로 assign
이 아닌 것으로 경고합니다. 현실.
그 문제를 해결하려면, 요구 된 유일한 것은 기본적으로 무엇이든 항상 올바르게 또한 비 ARC 코드 (
strong
및
retain
에서 작동
strong
, 모든 속성을 태그있는 속성에 의존하지 않습니다 단지 동의어 않을 것입니다 컴파일러는 정확히 똑같이 취급하므로 둘 다 비 ARC 코드에서 사용할 수 있습니다). 웃기는 일은 바로 스위프트가하는 일입니다. 생성 된 헤더에 많은 수의
strong
속성이 있지만 분명히 Swift가 수행하지 않는 상황이 있습니다 (실제로는 Swift 버그입니다).
이
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-property-no-attribute"
#import "xxx-Swift.h"
#pragma clang diagnostic pop
그냥 다른 헤더 파일, 예를 들어,에 그 팩을 다음과 같이 수행 할 수 있습니다 생성 된 헤더를 가져올 때 그 문제에 대한
쉬운 일-A-라운드는 경고를 비활성화하는 것입니다 My-xxx-Swift.h
을 입력 한 다음 코드에서 My-xxx-Swift.h
만 가져 오십시오.
일반적으로이 경고가 의미가 있으며 ARC와 비 ARC 코드를 혼합 할 때 끔찍한 버그를 예방하는 데 도움이 될 수 있으므로 전체 프로젝트 (예 : Xcode 빌드 설정)에서는 비활성화하지 않겠습니다 ARC와 비 ARC를 혼합 할 때 절대적으로 저장소 특성을 갖고 있지 않으므로 암시 적 특성에 의존하지 말고 항상 저장소를 명시 적으로 지정하는 것이 좋습니다.
아직 ARC를 사용하지 않는 이유가 무엇인지 알 수 없습니다. 나는 그것이 레거시 코드이지만, 레거시 코드는 업데이트되어야한다 ... –
"MRC"라 불리는 "pre-ARC"의 시대는 아마도 당신이 무엇을 사용하고 있는지를 아는 것이 좋다. – holex
@LordZsolt 사전 ARC 메모리 관리 체제 하에서 잘 테스트 된 대규모 코드베이스에 불필요하게 메모리 관리 버그가 발생하는 것을 방지합니다. – Bill