0

重複の可能性:
Objective-Cシングルトンはどのように見えるべきですか?

シングルトンの使い方を理解しようとしています。私は彼らに注意するために赤を持っていますが、彼らが彼らの積極的な用途を持つことができることも。

私のシナリオ:

現在、テストプロジェクトを設定しています。1つのViewControllerには、アクションを実行するために必要なボタンがあります。

FirstViewControllerにはUIWebViewがあります。

StoryboardとContainerViewを使用しているので、両方のViewControllerを同時に表示できます。

最初のViewControllerでは、.mファイルに次のコードがあります。

static FirstViewController *sharedController = nil;

+ (FirstViewController *)sharedController {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    //BBCSermonTabBarViewController *myVC = (BBCSermonTabBarViewController *)[storyboard instantiateViewControllerWithIdentifier:@"BBCNews"];

    if(sharedController == nil)
        sharedController = (FirstViewController *)[storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];

    return sharedController;
}

また、アルファを次のように変更するメソッドもあります。

-(void)hideWebView
{
    _webView.alpha = 0.3;
}

これで、SecondViewコントローラーに次のコードがあります。

-(IBAction)hideWebViewFromAnotherViewController
 {
   [[FirstViewController sharedController] hideWebView];
 }

そのアクションボタンは、他のViewControllerのwebViewのアルファを変更する必要がありますか?

そうでなければ、私は何を間違っているのですか?

前もって感謝します:-)

4

3 に答える 3

1

安全のために、また libdispatch ではとても簡単なので、if() チェックを行う代わりに、dispatch_once() 呼び出しでシングルトン作成者を保護する必要があります。

+ (FirstViewController *)sharedController {

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    static dispatch_once_t token;
    dispatch_once(&token, ^{

    sharedController = (FirstViewController *)[storyboard instantiateViewControllerWithIdentifier:@"firstViewController"];
    });

    return sharedController;
}

tokenセマフォのように使用され、ブロックを保護し、プログラムの実行中に一度だけ呼び出されるようにします。競合や同時読み取りから保護されています。

于 2013-01-26T00:16:23.433 に答える
1

シングルトンをよりよく理解するというあなたの目標は高く評価できますが、必要がない限りシングルトンを使用しないことをお勧めします。

シングルトンを使用することは、ほとんどの UI シナリオ (必要になったことはありません) では適切ではないと思います。オブジェクト間の通信には、次のいずれかの方法をお勧めします。

  • 通信したいオブジェクトへの参照を保持します。プロパティを追加して、後で呼び出す必要があるクラスへの参照を保存するだけです。シナリオで機能する場合は、弱参照にすることができます。

  • iOS/Objective-c アプリで一般的なデリゲート パターンを使用します。上記と同じですが、代わりにプロトコルを定義します。通常、プロパティは と呼ばれdelegateます。これにより、他のビューが共通のインターフェイスを使用して通信できるようになります。

  • 通知センターを使用します。ほとんどの場合、このオプションは好みませんが、多くのビューが知る必要があるイベントがあり、オブジェクトへの参照の受け渡しを処理したくない場合は、良いオプションかもしれません。

私の経験では、最初の使用時にクラスをインスタンス化するシングルトンの動作に実際に依存する必要がある場合、シングルトンは非 UI コードに最適に機能します。あなたの状況では、シングルトンを使用している唯一の理由は、アプリ全体でそのView Controllerにアクセスできるようにすることです。

于 2013-01-26T00:43:33.240 に答える
0

それはうまくいくはずです。潜在的な問題: _webView が nil であり、[FirstViewController sharedController] が有効な参照を返していません。hideWebViewFromAnotherViewController にブレークポイントを設定し、ステップスルーして、すべてが定義されていることを確認します。

于 2013-01-25T23:17:34.827 に答える