2012-06-03 1 views
2

저는 응용 프로그램을 만들고 많은 뷰를 한 번만 표시합니다. 그래서이 만드는 중이라서 :UIViewController 클래스에서 싱글 톤을 사용하지 않는 이점은 무엇입니까

+(listNewController *) singleton 
{ 
    return _singleton; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _singleton = self; 

어딘가를

- (void)viewDidUnload 
{ 
    _singleton = nil; 

지금뿐만 아니라 내가있는 viewDidLoad 만 _singleton 경우 호출 될 수 있도록 몇 가지 코드를 보호 할 수 있습니다 내 하나의 ViewController에 좋은 참조를 가지고 == nil.

하지만 대부분의 사람들은 싱글 톤이 아닌 응용 프로그램 위임자의 ViewController에 대한 참조를 넣습니다.

왜?

어쨌든 플러스 마이너스 란 무엇입니까?

+2

뷰가 한 번만 표시되면 싱글 톤이 필요하지 않습니다. 단일 인스턴스를 만들고 완료하면 처리 할 수 ​​있습니다 ... 아니면 뭔가 놓쳤습니까? – nielsbot

답변

0

먼저 대부분의 사람들이 응용 프로그램 대리인에 참조를 넣었는지 확신하지 못합니다. 대부분의 초보자는 분명히합니다. 왜냐하면 프로젝트를 만들 때 응용 프로그램 위임자가 바로 존재하기 때문입니다. 다른 작업을 수행하지 않고도 코드의 아무 곳에서나 액세스 할 수있는 유일한 객체입니다.

이것은 편리하기 때문에 모든 것을 거기에 넣는 것이 좋지 않다는 점을 주로 설명합니다. App Delegate는 전역 변수의 컨테이너가 아닌 응용 프로그램의 라이프 사이클과 관련된 작업을 수행하는 대리자 객체입니다. 따라서 캡슐화의 개념을 위반하여 위임자의 역할과 관련이없는 사물을 대리인에 저장합니다.

귀하의 경우에는 싱글 톤을 사용하여보기 컨트롤러의 단일 인스턴스를 반환합니다. 이것이 최선의 방법이라고 확신하지 못합니다. 특정 시나리오에서 효과가있는 것은 다중 뷰 컨트롤러의 경우 재사용 할 수 없습니다. 이런 종류의 클래스는 여러 번 인스턴스화 될 예정이므로, 의미가있는 경우이를 싱글 톤으로 정의하는 것이 적절하지 않습니다.

MyViewControllersSingleton과 같은 별도의 싱글 톤 클래스를 만든다면 다른 고유 컨트롤러를 속성으로 참조하는 것이 좋습니다. 싱글 톤 객체는 어느 곳에서나 같은 방법으로 호출 할 수 있습니다 :

[MyViewControllersSingleton sharedInstance].listNewController; 

대부분의 앱의 경우 나는 보통 내가 AppSingleton를 호출 한 싱글 독특한 뷰 컨트롤러에 내 전역 변수와 포인터의 대부분을 가지고있다. 그러나 더 나은 관심사를 원할 경우 여러 개의 싱글 톤을 만드는 것을 상상해보십시오. +load 사용

방법 1 :

-1

나는 아스 커를 해결하기 위해 노력하지만, 그냥 싱글을 만들기 위해 사용하는 두 가지 방법을 게시 무슨 문제가 확실하지 않다

@class MyClass 

static MyClass * __instance = nil ; 

+(void)load 
{ 
    @autoreleasepool { 
     __instance = [ [ self alloc ] init ] ; // (use your designated initializer) 
    } 
} 

+(MyClass*)sharedInstance 
{ 
    return __instance ; 
} 

@end 

방법 2, 게으른 초기화 :

@implementation MyClass 

+(MyClass*)sharedInstance 
{ 
    @synchronized(self) 
    { 
     if (!__instance) 
     { 
      __instance = [ [ self alloc ] init ] ; // (use your designated initializer) 
     } 

     return __instance ; 
    } 
} 

@end 

뷰 컨트롤러의 경우에,이 시도 :

@implementation MyViewController 

static MyViewController * __instance = nil ; 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 
{ 
    @synchronized([ self class ]) 
    { 
     self = __instance ; 
     if (!self) 
     { 
      self = [ super initWithNibName:nibName bundle:nibBundle ] ; 
      __instance = self ; 
     } 
    } 

    // ...finish init as normal here 

    return self ; 
} 

@end 
+0

ViewControler로는이 작업을 수행 할 수 없습니다.View Controller는 임의의 시간이 아닌 특정 시간에로드됩니다. –

+1

좋아, 왜 당신의보기 컨트롤러의 단일 인스턴스가 강요해야합니까? 정상적인 메커니즘을 사용하여 한 번만로드 할 수 있습니까? 더 단순 해 보인다. – nielsbot

+0

나는 실수를 저질 렀다. 모든 제한의 어머니는 당신이 생각하지 않습니까? –

관련 문제