2017-03-15 6 views
0

initialize()은 클래스가 첫 번째 메시지 (UserDefaults 등 설정)를 보내기 전에 코드를 실행하는 데 일반적으로 사용됩니다.AppDelegate에서 초기화 무시 - 여러 번 실행되는 코드로부터 보호

: 문서는 슈퍼 클래스 '구현은 여러 번 서브 클래스 initialize()을 무시하고 initialize() 여러 번 호출 될 경우 여러 번 코드를 더 실행에서 클래스를 보호하는 방법의 예를주지 않는다 호출 할 수 있음을 명시 하위 클래스가 initialize()을 구현하지 않으면 수퍼 클래스 구현이 여러 번 호출 될 수 있습니다. 런타임은 상속 된 구현을 호출하거나 서브 클래스가 명시 적으로 [super initialize]을 호출하는 경우 여러 번 호출 될 수 있습니다. 당신이 실행 여러 번되는로부터 자신을 보호하려는 경우, 당신은이 라인을 따라 구현을 구성 할 수 있습니다 : 내 AppDelegate에의 initialize()을 무시하고 두 번 이상 실행 가진 코드를 방지하기 위해 노력하고

+ (void)initialize { 
    if (self == [ClassName self]) { 
    // ... do the initialization ... 
    } 
} 

. self is AppDelegate.Type이 항상 true로 평가되는지 (그리고 Xcode에서 나에게 경고를 주는지) 점검 할 때, 클래스 검사는 나에게 이해가 가지 않는다.

우리가 수퍼 클래스가 아니기 때문에 클래스 검사가 적용되지 않습니다 (AppDelegate의 수퍼 클래스는 UIResponder 임)? 오버라이드 된 initialize() 메서드의 내용은 super을 호출하거나 클래스 검사를 수행하지 않고 한 번만 실행됩니까?

+0

'is' 대신'==='를 사용하면'AppDelegate'의 서브 클래스에 대해 true를 반환하지 않을 것이라고 생각합니다. – dan

+0

@dan 흠, 나는 참조를 비교하는 것을 고려하지 않았다. 이는 또한 좋은 선택이며 서브 클래스를 보호합니다. 답변으로 게시해야합니다. – JAL

+0

또는'if self == AppDelegate.self'. 그러나 AppDelegate의 하위 클래스를 만들지 않으면 해당 검사가 필요 없습니다. –

답변

0

일반적으로 initialize에서 코드를 한 번만 실행하려는 경우 (문서별로) 클래스를 검사하는 이유가 있습니다. 이 조건을 쓰면 initialize을 구현하지 않거나 [super initialize]을 호출하는 하위 클래스에서 보호 할 수 있습니다.

class Animal: NSObject { 
    class func initialize() { 
     //Some code I only want to run once 
    } 
} 


class Dog: Animal {} 

나는 새로운 Dog의 인스턴스를

이, Objective-C 런타임, 그래서 Dog가 나타납니다 (첫 번째 슈퍼 클래스) Dog의 계층 구조에서 모든 클래스initialize 방법을 보낼 것입니다 예를 들면 다음과 같습니다 클래스 계층 구조입니다 메시지,하지만 그렇게 될 것입니다 Animal. Doginitialize을 구현하지 않으므로 해당 수퍼 클래스가 메시지를 수신하므로 메시지가 해당 클래스 용인지 확인하는 검사를 추가하지 않으면 코드가 두 번 실행됩니다.

doesn't really make sense in Swift 및 AppDelegate에서는 코드가 한 번만 실행되도록하려면 the migration docs에 정의 된대로 지연 초기화 된 전역 또는 정적 속성을 사용해야합니다.