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
을 선언 할 수도 있습니다.
내가 말했듯이; 나는 이것들을 시험하지 않았다. 발견 한 사항이 있으면 게시하십시오.
내가 잘못하지 않았다면이 작업을 수행 할 수 없습니다. ARC 프로젝트의 일부 파일은 ARC를 비활성화 할 수 있지만 그 반대는 아닙니다. ARC로 프로젝트를 마이그레이션해야합니다. 이 질문은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/6368600/some-questions-about-automatic-reference-counting-in-ios5-sdk – bontoJR
'-fobjc-arc를 전달하여 개별 파일에 대한 ARC를 켤 수 있습니다 '. 그러나 질문은 미리 컴파일 된 정적 라이브러리와 관련이 있습니다. 전체 라이브러리가 ARC로 빌드 될 것이라고 가정합니다. –
예, 전체 라이브러리는 ARC로 작성되었습니다. – edc1591