ARC는 -fno-objc-arc? 파일을 표시하더라도 구조체 또는 공용체에서 Objective-C 객체를 금지합니다. 왜 그렇습니까?
-fno-objc-arc로 표시하면이 제한이 없다고 가정했습니다.
답변:
이 메시지를 받으면 __unsafe_unretained를 시도하십시오. 구조체의 객체가 유지되지 않는 경우에만 안전합니다. 예 : ARC와 함께 OpenFeint를 사용하는 경우 클래스 OFBragDelegateStrings는 구조체에서이 오류를 말합니다.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
...에
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
어떻게됩니까? 이 경우, 그것은 바로 ... 해제,하지만 난 컴파일러가 말할 것이다 (지금 그것을 테스트 할 수 없습니다) 궁금해하지 않습니다
struct를 사용하는 대신 Objective-C 클래스 를 만들어 데이터를 관리 할 수 있습니다 .
이는 arc가 구조체 또는 공용체의 객체를 추적 할 수 없기 때문입니다 (그 지점에서 일반 C 포인터이기 때문에).
문제의 파일 / 클래스를 표시 했더라도 -fno-objc-arc
여전히 arc에 의해 제어되는 객체를 매개 변수로 전달하여 메모리 누수가 발생할 가능성이 높습니다.
-fno-objc-arc
프로젝트 내에서 ARC 및 비 ARC 파일을 혼합 하는 데 사용할 수 있지만 struct 또는 union과 같은 일반 C 구조를 사용하는 경우 ARC를 전혀 사용할 수 없습니다.
이제이 변경 후 오류없이 작동하는 것 같습니다 .
즉, C 구조체의 Objective-C 객체에 일반 (강력한) 포인터를 넣을 수 있습니다. ARC에 의해 관리됩니다. 예를 들어 구조체가 파괴되면 유지되지 않습니다. 검증 대상 :
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)