ARC는 파일 -fno-objc-arc 표시에도 불구하고 구조체 또는 공용체에서 Objective-C 객체를 금지합니다.


85

ARC는 -fno-objc-arc? 파일을 표시하더라도 구조체 또는 공용체에서 Objective-C 객체를 금지합니다. 왜 그렇습니까?

-fno-objc-arc로 표시하면이 제한이 없다고 가정했습니다.

답변:


170

이 메시지를 받으면 __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;

4
또한 unsafe_unretained 변수 객체에 보유 된 객체를 할당하면 할당 후 해제 될 것임을 경고하는 문자열을 할당 할 때 문제가 발생합니다. 그리고 내가 사용하는 경우는 충돌
디팍 싱 네기

8
이것은 모든 문제를 해결하지 못합니다. 일반적으로 개체는 즉시 해제되어 사용할 수 없습니다.
Diziet 2012 년

예 -이 ... 해결책은 어떻게 든 나는 아직 알아낼 수 없었던 파생 소스 파일에 대해 ARC 해제하는 것입니다 ... 실제로 일을하지 않습니다
nielsbot

1
빌드 단계에서 파일에 -fno-objc-arc 플래그를 추가하면됩니다.
Abizern 2013 년

struct 필드가 "dumb reference"일 뿐이고 객체가 실제로 다른 곳 (예 : 내부)에서 유지 (소유)되는 경우 NSArray어떻게됩니까? 이 경우, 그것은 바로 ... 해제,하지만 난 컴파일러가 말할 것이다 (지금 그것을 테스트 할 수 없습니다) 궁금해하지 않습니다
니콜라스 미아리에게

30

struct를 사용하는 대신 Objective-C 클래스 를 만들어 데이터를 관리 할 수 있습니다 .


어떻게? 샘플은 어디에 있습니까?

그렇다면 왜 작은 사용 사례에 대해 구조화 할 수 없습니까?
Devanshu Saini

13

이는 arc가 구조체 또는 공용체의 객체를 추적 할 수 없기 때문입니다 (그 지점에서 일반 C 포인터이기 때문에).

문제의 파일 / 클래스를 표시 했더라도 -fno-objc-arc여전히 arc에 의해 제어되는 객체를 매개 변수로 전달하여 메모리 누수가 발생할 가능성이 높습니다.


하지만 내 프로젝트에서 arc 및 non-arc 파일을 어떻게 사용할 수 있습니까? 예를 들어 sharekit을 non-arc로 사용하고 인스턴스를 사용하여 게시 할 수 있습니다. 내가 사용하는 파일은 arc 파일입니다.
Zsolt 2011

-fno-objc-arc프로젝트 내에서 ARC 및 비 ARC 파일을 혼합 하는 데 사용할 수 있지만 struct 또는 union과 같은 일반 C 구조를 사용하는 경우 ARC를 전혀 사용할 수 없습니다.
voidStern

voidStern .. 감사합니다. "하지만 struct 또는 union과 같은 일반 C 구조를 사용하는 경우 ARC를 전혀 사용할 수 없습니다." -사실이 아닌 것 같아요. 내 파일에 ARC를 사용하고 있습니다. libharu 파일의 경우 arc가 아닙니다. 원래 문제를 해결하는 방법은 값을 별도로 C 파일에 전달하고 거기에 구조체를 만드는 것이 었습니다. 핵심은 호에서 비호로의 점프라고 생각합니다.
Zsolt 2011

1
조금 과장된 것일 수도 있습니다. 본질적으로 객체에 대한 포인터를 구조체와 공용체에 넣을 수 없으므로 ARC를 혼동 할 수 있습니다. 구조체 및 / 또는 공용체와 함께 일반 C 라이브러리를 사용하는 것이 가능해야합니다.
voidStern 2011

6

이제이 변경 후 오류없이 작동하는 것 같습니다 .

즉, C 구조체의 Objective-C 객체에 일반 (강력한) 포인터를 넣을 수 있습니다. ARC에 의해 관리됩니다. 예를 들어 구조체가 파괴되면 유지되지 않습니다. 검증 대상 :

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.