1

テーブル ビューとナビゲーション バーに追加ボタンを備えた iPhone アプリがあります。テーブル ビューには、 というNSObjectデータを保持するカスタムがありますdataBasedataBaseは、(strong, nonatomic) @propertyこのテーブル ビューの です。テーブル ビューには、新しいデータを に追加できる public メソッドがありますdataBase。追加ボタンをクリックすると、新しいセルと同じものを設定できる新しいビューへのセグエがあります。保存ボタンを押すと、別のセグエを使用してパブリック メソッドが呼び出され、情報が に追加されdataBaseます。ただし、dataBaseこの 2 番目のセグエが呼び出されると、元のオブジェクトはなくなります。つまり、 にはアイテムが 1 つしかありませんdataBase。これはセグエで予想されることですか?オブジェクトを存続させるために、オブジェクト自体を渡す必要がありますか?

これが非常に初心者の質問である場合は申し訳ありません。私はiOSプログラミングと参照カウントメモリ管理が初めてです。

4

1 に答える 1

1

これはセグとは何の関係もないので、自分で問題を混同しないでください。

参照カウントされたオブジェクトの基本的な扱いは、オブジェクトへの参照が少なくとも1つある限り、割り当てが解除されないことです。ただし、参照カウントがゼロに達すると、オブジェクトの割り当てが解除されます。

したがって、オブジェクトを「存続」させたい場合は、何らかの方法でオブジェクトへの参照を保持する必要があります。プログラムの存続期間中データベースが存在することを期待する場合、通常のパターンは「シングルトン」オブジェクトを使用することです。これは多くの方法で達成できます。簡単な方法は、一般的なシングルトンパターンを模倣することです。

@interface Database : NSObject
    + (Database*)sharedInstance;
    // other stuff for your class
@end

@implementation Database
    + (Database*)sharedInstance {
        static Database *instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[Foo alloc] init];
            // Any other initialization necessary...
        });
        return instance;
    }
@end

このdispatch_onceようなものは、マルチスレッドアプリケーション(すべてのiOSアプリがそうであるべきです)の正確さを保証します。

さて、あなたがあなたの「共有」Databaseオブジェクトを必要とするとき...

Database *database = [Database sharedInstance];

このdispatch_onceコードは、スレッドセーフにするだけでなく、作成コードが1回だけ実行されるようにします。関数内の静的オブジェクトはオブジェクトへの参照を保持するため、割り当てが解除されることはなく、プログラムの存続期間中存続します。

これは、この状況に対処するための一般的なパターンの1つですが、他にも多くのパターンがあります。重要なのは、オブジェクトを存続させたい場合は、そのオブジェクトへの参照を保持する必要があるということです。各ViewControllerに渡すか、「共通の」場所に保管するか、不要なときにディスクにアーカイブし、後で必要になったときに再水和します...さまざまな方法で...

于 2012-10-21T20:53:52.513 に答える