2012-03-15 6 views
12

저는 2 년 동안 종교적으로 그렇게 해왔습니다. [super init...] 방법을 호출 한 후 self의 타당성을 검사 : this question 멋지게 요약으로init 메소드에서 (self)를 확인하는 이유는 무엇입니까?

self = [super init]; 
if (self != nil) { 
    // initialize 
} 
return self; 

당신은 다양한 방법으로이 작업을 수행 할 수 있지만, 그 질문이 구문에 관한 것입니다, 광산 개념에 관한 것입니다.

최근에 Objective-C를 배우는 동료로부터 질문을 받았는데 "왜 내가 자기 존재에 대해 테스트해야합니까? 그것이 거기에 있다는 것이 명백하지 않습니까?" 그리고 나의 짧은 대답은 "잘못되었다. 예, 실패 할 수있는 경우가있다. 그래서 그것이 이유 다." 그러나 오랜 대답은 어디서나 테스트를하는 이유는 이해할 수 없다는 것입니다. 실패 할 수있는 인스턴스는 매우 드뭅니다. Apple's reference guide은 파일을 사용하여 초기화하거나 싱글 톤을 처리 할 때처럼 특정 사례에 대해 알려줍니다. 그러나이 소리는 [super init]이 작동해야한다는 규칙에 대한 매우 드문 예외입니다.

그럼 내 질문은 다음과 같습니다. 왜 우리는 항상 자기의 타당성을 테스트합니까? 우리는 어디에서나 그 예외를 잡기 위해 그것을 구현하고 있습니까? 왜 if (self) 전체를 건너 뛰고 성공할 확률이 100 % (또는 결코 그렇지 않은 경우) 인 경우 객체를 초기화해야합니까?

P.S. 나는이 질문이 너무 기본적인 것이기 때문에 속은 사람이어야한다는 것을 알지만, 나의 검색 질의는 초기화 문법에 대해 많은 다른 질문을 가지고있다. Dupe 링크는 높이 평가됩니다.

+3

[Object-C에서 self = \ [super init \]가 nil이 아닌지 확인해야하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/1287950/in-objective-c-why- should-i-check-if-self-super-init-is-not-nil) – JeremyP

답변

6

여기에이 주제에 대한 a helpful old article과 이니셜 라이저에 대한 몇 가지 일반적인 오해가 포함되어 있습니다. 기본 아이디어는 특정 클래스가 수퍼 클래스 구현과 관련되어서는 안되기 때문에 오류가 발생할 경우 항상 nil을 확인한다는 것입니다.

+1

링크 된 기사가 자리하고 있습니다. 불행하게도,이 주제에 관한 잘못된 정보가 많이 있습니다. Wil Shipley로 잘 알려진 유명인 출신 인 분들도 있습니다. (Wil은이 주제에 대한 게시를 수정했지만, 필자는 그 이후로 링크하지 않을 것입니다. 응답자가 링크 한 Mike Ash의 기사에는 거의 아무것도 추가하지 않습니다.) – ipmcc

+0

그 기사는 실제로 도움이되며 내 모든 질문에 답한 다음 일부는 대답합니다. @jtbandes에게 감사합니다! – epologee

1

uhm ... 이것은 확실히 좋은 질문입니다. 나는 그것을 작성했으면합니다. 나는 목표 - C의 전문가가 아니지만, 나는 당신의 좌절을 느낄 수

:-) downvoter의 두려움없이, 내 의견을 제시하려고하지만 것이다 :

err, yeah, well there's instances where it can fail, so that's why. 

그것은 완벽하게 좋은 대답. 나는 당신이 자기를 확인하지는 않는다고 생각하지만, 슈퍼 객체가 정확하게 초기화되었는지를 확인하고있다. 나에게 그것은 다른 관점이다.

어떤 경우에도 객체가 올바르게 할당되고 초기화되었는지, 특히 모든 가면 메모리 할당 문제가있는 C의 맨 위에있는 objective-c에서 확인하는 것이 좋습니다. Init는 'alloc'다음에옵니다. 할당 된 객체를 변수 등으로 초기화해야합니다.

예를 들어 생성자 체인이 잘 정의되어 있고 컴파일러가 검사 한 Java와 같은 언어에서 객체는 나중에 해당 객체를 사용할 때 null 포인터 오류가 발생합니다. 종종 Java에서 객체를 할당하는 데 오류가 없지만 종종 메서드를 사용하면 임시 try/catch 오류 블록으로 둘러싸여 야합니다. 따라서 확인은 응용 프로그램 수명주기의 뒷부분에서 수행됩니다.

대신 objective-c에서 많은 이유로 nil 객체를 가질 수 있으며 응용 프로그램이 충돌하지 않으면 잘못된 객체에 메시지를 보낼 수 있습니다. 솔직히 말해 NSObject의 서브 클래스에서 직접 인스턴스화 할 때 nil을 점검하는 유틸리티를 모른다. 그러나 프레임 워크 나 다른 사람들이 제공하는 정적 라이브러리에서 클래스를 확장하는 경우 객체 유효성 검사와 함께 확실히 안전하다고 느낄 것입니다.

관련 문제