source

목표-C에서 self = [super init]가 0이 아닌지 확인해야 하는 이유는 무엇입니까?

ittop 2023. 5. 7. 11:51
반응형

목표-C에서 self = [super init]가 0이 아닌지 확인해야 하는 이유는 무엇입니까?

Objective-C의 in 메서드 작성에 대한 일반적인 질문이 있습니다.

초기화를 계속하기 전에 init 메서드가 self = [super init]가 0이 아닌지 확인해야 하는 것은 어디에서나 볼 수 있습니다(Apple의 코드, 책, 오픈 소스 코드 등).

init 메서드의 기본 Apple 템플릿은 다음과 같습니다.

- (id) init
{
    self = [super init];

    if (self != nil)
    {
        // your code here
    }

    return self;
}

왜요?

내 말은 언제 다시 0으로 돌아갈 수 있을까요?만약 내가 NSObject에 전화를 걸어 0을 돌려받았다면, 뭔가 정말 엉망이 되었을 것입니다, 그렇죠?그런 경우에는 프로그램을 작성하지 않는 편이 나을 수도 있습니다.

클래스의 init 메서드가 0을 반환할 수 있다는 것이 정말 그렇게 일반적입니까?그렇다면, 어떤 경우에, 그리고 왜?

예:

[[NSData alloc] initWithContentsOfFile:@"this/path/doesn't/exist/"];
[[NSImage alloc] initWithContentsOfFile:@"unsupportedFormat.sjt"];
[NSImage imageNamed:@"AnImageThatIsntInTheImageCache"];

등등. (참고: 파일이 없는 경우 NSData에서 예외를 발생시킬 수 있습니다.)문제가 발생했을 때 0을 반환하는 것이 예상되는 동작인 영역이 꽤 있으며, 이 때문에 일관성을 위해 거의 항상 0을 확인하는 것이 표준 관행입니다.

이 특별한 관용구는 모든 경우에 효과가 있기 때문에 표준입니다.

드물긴 하지만, 어떤 경우는...

[super init];

다른 인스턴스를 반환하므로 자신에게 할당해야 합니다.

또한 0을 반환하는 경우가 있으므로 코드가 더 이상 존재하지 않는 인스턴스 변수 슬롯을 초기화하지 않도록 0을 확인해야 합니다.

중요한 것은 문서화된 올바른 사용 패턴이며, 사용하지 않으면 잘못된 것이라는 것입니다.

대부분의 클래스에서 [super init]의 반환 값이 0이고 표준 관행에서 권장하는 대로 확인하고 0이면 조기 반환하면 기본적으로 앱이 제대로 작동하지 않습니다.생각해보면, 만약 (self!= nil) 체크가 있다면, 수업을 제대로 운영하기 위해서는 실제로 99.99%의 시간이 비흡연자가 될 필요가 있습니다.자, 어떤 이유로 [super init]가 0을 반환했다고 가정해 보겠습니다. 기본적으로 0에 대한 체크는 기본적으로 클래스의 호출자에게 책임을 떠넘기는 것입니다. 통화가 성공적이었다고 자연스럽게 가정하기 때문에 어쨌든 실패할 가능성이 높습니다.

기본적으로, 제가 이해하는 것은 99.99%의 경우, if(self!= 0)는 더 큰 견고성 측면에서 아무것도 사지 않는다는 것입니다. 왜냐하면 당신은 단지 당신의 호출자에게 책임을 떠넘기고 있기 때문입니다.이 문제를 제대로 처리하려면 전체 호출 계층에서 검사를 수행해야 합니다.그럼에도 불구하고, 앱이 조금 더 깨끗하게/강력하게 실패할 수 있습니다.하지만 여전히 실패할 것입니다.

라이브러리 클래스가 [super init]의 결과로 임의로 0을 반환하기로 결정했다면, 어쨌든 당신은 거의 f****ed이고, 그것은 라이브러리 클래스의 작성자가 구현을 잘못했다는 것을 나타내는 것에 가깝습니다.

저는 앱이 훨씬 더 제한된 메모리에서 실행되었을 때 이것이 레거시 코딩 제안에 가깝다고 생각합니다.

그러나 C 레벨 코드의 경우, 나는 일반적으로 NULL 포인터에 대해 malloc()의 반환 값을 확인합니다.반면에, 목표-C의 경우, 반대의 증거를 찾을 때까지, 저는 일반적으로 if(self!= nil) 검사를 건너뛸 것이라고 생각합니다.왜 차이가 있습니까?

왜냐하면, C와 malloc 수준에서, 어떤 경우에는, 실제로 부분적으로 회복될 수 있기 때문입니다.제 생각에 목표-C에서는 99.99%의 경우에 [super init]가 0을 반환하면 처리하려고 해도 기본적으로 f****ed가 됩니다.당신은 그냥 앱이 중단되고 그 여파에 대처하는 것이 좋을 것입니다.

이것은 위에 언급된 내용을 요약한 것입니다.

슈퍼클래스가 돌아온다고 치자.nil무슨 일이 일어날까요?

만약 당신이 관례를 따르지 않는다면.

당신의 코드는 당신의 중간에 충돌할 것입니다.init방법단. (단,, ▁(unless▁(법,init중요한 기능을 하지 않음

만약 당신이 규칙을 따른다면, 슈퍼 클래스가 0으로 돌아올지도 모르고 (대부분의 사람들은 결국 여기에 있게 됩니다.

는 당의코드나충것이다돌, 할면당인스는스턴신의왜냐신하중는에▁your▁is▁is▁your▁atbal는▁because스▁code▁pro인▁gonna▁instance,▁crash턴스by▁later당당신.nil당신이 뭔가 다른 것을 기대했던 곳.또는 프로그램이 충돌하지 않고 예기치 않게 작동합니다.요?이것으로 드릴까요?모르겠어요...

만약 당신이 규칙을 따른다면, 기꺼이 당신의 하위 클래스가 0으로 돌아오는 것을 허용합니다.

코드 문서(!)는 다음과 같이 명확하게 명시되어야 합니다: "returns...또는 "0"으로 표시되며, 나머지 코드는 이 문제를 처리할 준비가 필요합니다.이제 이해가 됩니다.

이 일적으클다래가경에서 직접 된다면,NSObject그럴 필요가 없을 겁니다.하지만, 당신의 클래스가 다른 클래스에서 파생된 것처럼, 그들의 이니셜라이저가 돌아올 수도 있는 것은 좋은 습관입니다.nil그런 경우 이니셜라이저가 이를 캡처하여 올바르게 동작할 수 있습니다.

로 저는 , 는 고네리, 로최관, 는의을행, 저참따직에서 파생된 수업에도 NSObject.

네말맞아이, 종그글쓸있어수도을냥종넌▁just,▁write있▁often,[super init]하지만 그것은 어떤 하위 클래스에도 효과가 없을 것입니다.은 단지 한 하는 것을 에, 는 표준 . 심지어 가끔 필요할 때도 그렇습니다. 그래서 우리는 표준을 얻습니다.if (self = [super init])과 0이 아닌 취하는 것입니다.self계정으로 반환됩니다.

흔한 실수는 쓰는 것입니다.

self = [[super alloc] init];

하위 클래스 생성자/init에서 원하는 것이 아닌 슈퍼 클래스의 인스턴스를 반환합니다.하위 클래스 메서드에 응답하지 않는 개체를 다시 가져오면 혼란스러울 수 있으며 메서드나 식별자를 찾을 수 없는 경우 등에 응답하지 않는 혼동스러운 오류가 발생합니다.

self = [super init]; 

슈퍼 클래스에 하위 클래스의 멤버를 설정하기 전에 먼저 초기화할 멤버(클라이언트 또는 다른 개체)가 있는 경우 필요합니다.그렇지 않으면 objc 런타임이 모두 0 또는 0으로 초기화합니다.(메모리 청크를 전혀 지우지 않고 할당하는 경우가 많은 ANSIC와 달리)

메모리 부족 오류, 누락된 구성 요소, 리소스 획득 실패 등으로 인해 기본 클래스 초기화가 실패할 수 있으므로 제로(0)를 확인하는 것이 현명하며 몇 밀리초 미만의 시간이 소요됩니다.

이는 초기 확대가 작동했는지 확인하기 위한 것이며, init 메서드가 0을 반환하지 않은 경우 if 문이 true를 반환하므로 개체가 올바르게 생성되었는지 확인하는 방법입니다.내가 그것이 실패할 수 있다고 생각할 수 있는 몇 가지 이유는 슈퍼 클래스가 모르는 오버라이드된 init 방법이거나 그런 종류의 것일 수 있지만, 나는 그것이 그렇게 흔하다고 생각하지 않을 것입니다.하지만 만약 그런 일이 일어난다면, 충돌이 일어나지 않는 것이 좋을 것입니다. 그래서 항상 점검을 받죠.

OS X에서는 다음과 같은 가능성이 없습니다.-[NSObject init]메모리 문제로 인해 실패합니다.iOS에 대해서도 마찬가지입니다.

또한 반환될 수 있는 클래스를 하위 분류할 때 쓰기 연습이 좋습니다.nil이유야 어떻든

언급URL : https://stackoverflow.com/questions/1287950/in-objective-c-why-should-i-check-if-self-super-init-is-not-nil

반응형