2017-01-21 4 views
1

어리석은 질문입니다 (미안).하지만 대개 내 앱에서 다른 사람의 VC를 상속받을 수있는 rootVC가 있습니다. 그래서이 루트의 배수 인스턴스가 있다는 것을 알게되었습니다. 다른 모든 VC와 상속받을 RootViewController를 만드는 것이 좋습니다.

let window = UIWindow(frame: UIScreen.main.bounds) 
let root = SplashViewController(nibName: "SplashViewController", bundle: nil) 
window.rootViewController = UINavigationController(rootViewController: root) 
window.makeKeyAndVisible() 

self.window = window 

그런 다음 내 RootViewController에서 SplashViewController 상속은 좀보기 설정을 할 수있는 예를 들어, AppDelegate에 나는 나의 첫 번째보기를 호출합니다. 그러나, 내 루트에서 상속받는 다른 VC (예 : InitialViewController)를 호출하면 루트에서 새 인스턴스를 만들거나 동일한 인스턴스를 사용하고 있습니까? 그리고 그것이 좋은 연습이라고 생각합니까?

나는 읽기 및 검색하지만 난 찾거나 API를 참조 명확하게 이해할 수 없었다되었다 https://developer.apple.com/reference/uikit/uiviewcontroller

어떤 제안을? 미리 감사드립니다!

답변

1

모든보기 컨트롤러에 대해 공통 하위 클래스를 사용하는 것이 유용 할 수 있지만 너무 많이 부담하지는 마십시오. 가능한 경우 합리적인 경우 상속 대신 컴포지션을 사용하는 것도 고려하십시오 (Prefer composition over inheritance?).

그럼 난 몇 가지보기 설정을 할 수 있습니다 내 RootViewController에서 SplashViewController 상속합니다. 그러나, 내 루트에서 상속받는 다른 VC (예 : InitialViewController)를 호출하면 루트에서 새 인스턴스를 만들거나 동일한 인스턴스를 사용하고 있습니까?

걱정하지 마십시오. 글로벌 범위에서 정적 변수 또는 변수를 사용하지 않으면 뷰 컨트롤러의 각 인스턴스가 독립적입니다.

+0

당신이 @werediver 감사 좋아하는 이유 당신이 얼마나,

protocol CommonTraits { } extension CommonTraits { // provide default implementations of common methods } protocol SpecialSetOfTraits { } extension SpecialSetOfTraits { // provide default implementations of common methods } Class A : CommonTraits {} // less bloating Class B : CommonTraits, SpecialSetOfTraits { } // Additional functionality. 

이것은이 생각! 실제로 나는 작곡에 대해 들어 본 적이 없다고 생각합니다. 그래서 내가 상속 받게 될 나의 어머니 계급은 어떤 종류입니까? UIViewController? (할 수 없었다, 그렇지?). 그 루트 (내가 사용하고 있지만이 교장에 대해 생각 해본 적이 없다)를 안전하게하려면 정적을 사용할 수 없습니까? 정적으로 인스턴스화를 하나만 허용하지 않습니까? 내 걱정은 생성 된 첫 번째 호출 외에도 매번 루트를 인스턴스화하는 것입니다 (메모리 누수 생성). 내가 명확하지 않다면, 여기에 제한된 영어를 유감스럽게 생각한다. – Gehlen

+0

@Gehlen 구성과 상속은 OOP의 중요한 개념이므로 시도해 보자. 상속 트리는 UIViewController와 같이 임의의 깊이 일 수있다. >'MyBaseViewController' ->'SettingsScreenViewController'를 참조하십시오. 'SettingsScreenViewController'의 각 인스턴스는'MyBaseViewController'와'MyBaseViewController'를 모두 가지게됩니다.하지만 그건 누출이 아니며 의도적으로 설계된 것입니다. 그것은'SettingsScreenViewController'의 각 인스턴스가 독립적으로 작동하도록 허용합니다. – werediver

+0

멋진 @werediver! 내 개념이 틀렸어 .. 나는 작곡을 살펴볼거야. 다시 한 번 감사드립니다! – Gehlen

1

이 예제는 anti patterns of OOPS에 해당합니다. 스위프트에서는 프로토콜을 사용하여이를 처리 할 수 ​​있습니다.

말하자면, 어떤 클래스에는 다른 사람들이 가지고 있지 않은 특별한 기능이 필요한 경우 상속받을 공통 클래스가 있다고합시다. 이를 공통 수퍼 클래스에 추가하도록 선택하면 수퍼 클래스를 상속하는 다른 모든 서브 클래스를 확장하는 경향이 있습니다. 그렇지 않은 경우 코드를 복제해야 할 수 있습니다.

당신은 프로토콜의 사용으로 우아하게 문제를 접근 할 수, 난 내가 스위프트 :