3

ARC를 사용하여 코딩 된 정적 라이브러리를 만들었습니다. 다른 사람들이 사용할 수 있도록이 라이브러리를 배포 할 계획입니다. ARC가 아닌 프로젝트에 ARC 정적 라이브러리를 포함 할 필요는 없지만 ARC 헤더 파일은 어떻게해야합니까? 예를 들어 내 ARC 정적 라이브러리의 헤더는 weakstrong으로 속성을 선언하지만 이러한 헤더를 ARC가 아닌 프로젝트에 포함하려고하면 컴파일러가 괴롭힘을 당합니다.ARC가 아닌 프로젝트에 ARC 헤더 포함

아이디어가 있으십니까?

+0

내가 잘못하지 않았다면이 작업을 수행 할 수 없습니다. ARC 프로젝트의 일부 파일은 ARC를 비활성화 할 수 있지만 그 반대는 아닙니다. ARC로 프로젝트를 마이그레이션해야합니다. 이 질문은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR

+1

'-fobjc-arc를 전달하여 개별 파일에 대한 ARC를 켤 수 있습니다 '. 그러나 질문은 미리 컴파일 된 정적 라이브러리와 관련이 있습니다. 전체 라이브러리가 ARC로 빌드 될 것이라고 가정합니다. –

+0

예, 전체 라이브러리는 ARC로 작성되었습니다. – edc1591

답변

3

strong의 경우 retain 만 사용할 수 있습니다. 그들은 동일합니다.

weak이 더 까다 롭습니다. 작동해야하는 여러 가지 방법을 알고 있지만, 최선의 방법은 아닙니다.

먼저 실제로 필요한 것이 있는지 확인하십시오. iOS4를 지원하는 경우 weak을 사용할 수 없으므로 문제는 확실하지 않습니다. 내 직감은 아마도 나는 단지 weak을 피하고 이러한 모든 문제가 사라지게 할 것입니다. 약한 것은 좋지만 대부분의 경우 피해야하는 큰 문제는 아닙니다.

그렇다면 몇 가지 접근 방식이 있습니다. 가장 좋은 방법은 헤더에 속성이없는 weak 접근자를 선언하는 것입니다. 대신이의 :

@property (nonatomic, readwrite, weak) id delegate; 

이 작업을 수행 :

- (id)delegate; 
- (void)setDelegate:(id)aDelegate; 

그런 다음 당신은 여전히 ​​당신의 구현 파일 내부에 weak 속성을 선언 할 수 있습니다. 호출자는이 점 표기법을 계속 사용할 수 있습니다.

setDelegate:은 기술적으로 __strong id을 사용하므로 여기에 컴파일 오류가 발생할 수 있습니다. 그런 경우, 단지

- (void)setDelegate:(id)aDelegate { 
    _delegate = aDelegate; 
} 

setDelegate: 그것을 테스트하지 않았습니다 손으로 구현,하지만 작동합니다. weak 속성으로 선언하지 않고 @implementation 블록에 __weak 인 ivar _delegate을 선언 할 수도 있습니다.

내가 말했듯이; 나는 이것들을 시험하지 않았다. 발견 한 사항이 있으면 게시하십시오.

+0

이미 컴파일 된 정적 라이브러리 인 경우 정적 라이브러리에서 컴파일 된 구현에 영향을 미치지 않으므로 응용 프로그램으로 가져온 헤더를 간단히 변경할 수 있습니다. –

+0

매우 흥미로운 점. 약간 무서운, 그러나 아마 효과적.나는 당신이 이것을 위해 사용할 수있는 프리 프로세서 매크로를 알지 못한다. 그러나 이것은 접근법을 더 단순하게 만든다. –

+0

그럴 수도 있습니다. 이 일에 반대하는 논거가 있습니까, 아니면 꽤 안전할까요? – edc1591

관련 문제