2013-01-31 2 views
10

나는이 같은 초기화 쓰기 실험 계획안. 대리자 인수가 UIAlertViewDelegate 프로토콜을 준수하도록 지정하지 않은초기화는

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... 

:

그러나 나는 즉 UIAlertView 초기화 방법은 다음과 같습니다 것으로 나타났습니다? 애플이 왜 그렇게했는지 모든 단서?

+0

내가 추가하기가 너무 게으른 줄 알았거나, 모든 UIAlertViewDelegate 메서드가 선택 적이기 때문에 대리자가 프로토콜을 준수하는지 여부는 중요하지 않습니다. – howanghk

+0

이 경우에는 이점이 없으므로 프로토콜을 클래스에 부합시키는 것이 더 고통 스러울 것입니다. – holex

답변

1

나의 이해는 API가 몇 년 전에 큰 혼란이었고, 그들은 여전히이 모든 문제를 해결하는 것입니다.

최근까지도 많은 프로토콜이 비공식적이었으며 API의 거의 모든 곳에서 대표자는 id으로 만 발견되었습니다. Apple은 모든 버전에서 단계별로 수정하고 있습니다. 예를 들어, 공식 NSURLConnection 대표자는 iOS 6.0과 함께 제공됩니다. 또는 iOS 6.1에서 id 반환 유형 중 일부가 instancetype으로 변경되었습니다.

음,이 헤더 파일을 확인한 후, 내 초기 아이디어 :

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate

분명 누군가가 선언에 프로토콜을 추가하고 싶어하지만 주석을 추가합니다. 나는 그들이 호환성을위한 프로토콜없이 그것을 떠났을 것으로 짐작하고있다.

4

좋은 질문입니다! 나는 컴파일 타임에 더 많은 에러를 잡기 위해서 똑같은 일을한다.

Apple은 자신의 기준을 준수하는 것처럼 보입니다. Concepts in Objective-C에 명시된 바와 같이 :

다음 단계를 완료, 사용자 정의 클래스에 대한 대리자를 구현하려면 :

는 클래스 헤더 파일에 위임 접근 방법을 선언합니다.

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

이 접근 방법들을 구현한다. 메모리 관리 프로그램에서 유지주기를 피하려면 setter 메서드가 대리자를 유지하거나 복사해서는 안됩니다.

- (id)delegate { 
    return delegate; 
} 

- (void)setDelegate:(id)newDelegate { 
    delegate = newDelegate; 
} 
+0

UITableView.h를 체크하면 @property (nonatomic, assign) id delegate;를 볼 수 있기 때문에 그것들을 섞어 보일 것입니다 :-) –

관련 문제