ARC를 사용하고 iOS 4.0을 대상으로 할 때 약한 참조를 어떻게 대체합니까?


87

Xcode 4.2로 첫 번째 iOS 앱을 개발하기 시작했고 "유틸리티 애플리케이션"템플릿 (FlipsideViewController와 함께 제공되는 템플릿)으로 iOS 5.0을 대상으로했습니다.

ARC는 컴파일 타임 기능이기 때문에 iOS 4 와도 호환되어야한다고 읽었으므로 앱을 4.3으로 타겟팅하고 컴파일을 시도했습니다. 이렇게하면 다음 오류가 발생합니다.

FlipsideViewController.m : 오류 : 자동 참조 계산 문제 : 현재 배포 대상이 자동화 된 __weak 참조를 지원하지 않습니다.

다음 줄을 참조하고 있습니다.

@synthesize delegate = _delegate;

해당 변수는 다음과 같이 선언됩니다.

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

나는 "약한 참조"가 iOS 4에서 지원되지 않는다는 것을 알고 있지만, 왜 약한 참조를 사용하여 시작해야하는지 이해하지 못하며 사용을 피하기 위해 재 작성하는 방법을 알아낼 수 없습니다. 여전히 ARC를 활용하고 있습니다 (결국 iOS 4 및 5에서 작동해야합니다).

답변:


149

이전 OS를 대상으로하려면 속성 선언 unsafe_unretained대신 사용할 수 weak있으며 대부분 동일한 방식으로 작동해야합니다. weak타겟이 사라지면 nil 자체를 참조하지만 unsafe_unretained연결하려는 객체가 할당 해제 될 때 댕글 링 포인터로 바뀔 가능성을 열어 둡니다. 후자는 assign수동 메모리 관리에서 속성 선언으로 사용한 것과 동일한 동작 입니다.

당신은 내가 내 대답에 언급 사이클, 유지 피하기 위해이 작업을 수행 여기를 . 원래 개체에 대한 강력한 포인터가있을 수있는 항목에 대한 강력한 포인터를 원하지 않습니다. 그러면 아무것도 제대로 해제되지 않습니다.


조언 해주셔서 감사합니다. "이전 OS를 대상으로 ..."라고 말합니다. 이것은 5.0 이전의 앱 빌드에서만 unsafe_unretained를 사용해야 함을 의미합니까? 아니면 내 코드에서 unsafe_unretained를 사용하고 4.x와 5.x를 모두 대상으로 빌드 할 수 있습니까?
Mason G. Zhwiti

1
@Mason- unsafe_unretainediOS 4.x 및 5.0 모두에서 지원되므로 이전 버전과의 호환성을 제공합니다. 5.0 전용 빌드를 수행하는 경우 weak추가 안전을 활용하도록 전환 할 수 있습니다.
Brad Larson

나는 unsafe_unretained를 시도했지만 어쨌든 작동했습니다. 그러나 ' "** __NSAutoreleaseNoPool () : __NSArrayM 클래스의 개체 0x564bd90이 풀이없는 상태로 자동 해제되었습니다."*'누수 만 발생하는 것이 정상입니까?
5 번째

1
@fifth-그것은 완전히 관련이없는 문제입니다. 자동 릴리스 풀을 사용하지 않고 백그라운드 스레드에서 무언가를 실행하고 있습니다. 수동으로 생성 된 스레드에는 자체 자동 릴리스 풀이 없으므로 직접 생성해야합니다 @autoreleasepool(이전 수동 참조 계산 구현의 경우 ARC, NSAutoreleasePool에서).
Brad Larson

@Brad, 도움이 됐고, 경고가 사라졌고, performSelectorInBackground 호출이 여러 번 받았습니다.
5 번째

11

추가 안전을 위해 약한 참조 만 사용하는 경우 사용 가능한 경우 새 런타임 함수를 수동으로 호출하고 __unsafe_unretained그렇지 않은 경우 변수 에 대한 단순 할당으로 대체합니다 .

ZWRCompatibility.h 는 이것을 다소 단순화합니다.


10

Mike Ash의 호환성 라이브러리 PLWeakCompatibilty 덕분에 이제 iOS 4.x에서도 __weak을 사용할 수 있습니다.

구성이 매우 쉬우 며 5.x보다 추가 고려 사항이나 노력이 필요하지 않습니다.

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