2

アプリケーションを作成していますが、多くのビューが1回だけ表示されます。だから私はこれを作っています:

+(listNewController *) singleton
{
    return _singleton;
}

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

どこかで

- (void)viewDidUnload
{
    _singleton = nil;

これで、単一のViewControllerへの適切な参照を取得しただけでなく、_singleton==nilの場合にのみviewDidLoadが呼び出されるようにコードセーフガードを実行できます。

ただし、ほとんどの人は、ViewControllerへの参照をシングルトンではなくアプリケーションデリゲートに配置します。

なんで?

とにかくプラスとマイナスは何ですか?

4

2 に答える 2

0

まず、ほとんどの人がアプリケーションデリゲートに参照を入れているかどうかはわかりません。ほとんどの初心者は確かにそうします。なぜなら、プロジェクトを作成するときにアプリデリゲートがすぐそこにあり、それがコード内のどこからでも何もしなくてもアクセスできる唯一のオブジェクトだからです。

欠点は主に、便利だからといってすべてをそこに入れるのはベストプラクティスではないということです。App Delegateはまさにそれであり、グローバル変数のコンテナーではなく、アプリケーションのライフサイクルに関連するアクションを実行するデリゲートオブジェクトです。したがって、そのデリゲートの役割に関係のないものをデリゲートに格納するだけのカプセル化の概念に違反します。

あなたの場合、シングルトンを使用してViewControllerの単一インスタンスを返しています。これが最善の方法かどうかもわかりません。特定のシナリオでうまく機能するものは、複数のViewControllerの場合は再利用できません。この種のクラスは複数回インスタンス化されることを意図しているため、それが理にかなっている場合は、シングルトンとして定義するのは場違いだと感じます。

私の意見では、別のシングルトンクラス(MyViewControllersSingletonなど)を作成して、さまざまな一意のコントローラーをプロパティとして参照する方がよいと思います。シングルトンオブジェクトは、同じ方法でどこからでも呼び出すことができます。

[MyViewControllersSingleton sharedInstance].listNewController;

ほとんどのアプリでは、通常、ほとんどのグローバル変数と、AppSingletonと呼ばれる1つのシングルトン内の一意のビューコントローラーへのポインターがあります。ただし、関心の分離を改善したい場合は、複数のシングルトンを作成することを想像できます。

于 2012-06-03T08:04:37.740 に答える
-1

質問者がどのような問題を解決しようとしているのかわかりませんが、シングルトンを作成するために使用する2つの可能な方法を投稿するだけです。

方法1、使用+load

@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
于 2012-06-03T08:18:18.607 に答える