0

Objective C のメモリ管理に問題があります。Advanced Memory Management Programming Guideを読みましたが、ARC を完全に放棄してメモリを手動で管理するという例外を除いて、問題の解決策が見つかりません。

問題は次のとおりです。

Controller特定の時間に何をすべきかに関する情報を保持するクラスを作成しました。

このControllerクラスは、アプリの残りの部分にビデオを再生するように指示します (たとえば)。ビデオは正常に再生されます。ビデオの再生が終了すると、Controllerクラスは次に何をすべきかを理解します。

残念ながら、Controllerビデオの再生が開始されるとすぐに、ARC によってクラスが解放され、割り当てが解除されます。そのため、ビデオが終了するまでに、アプリはControllerクラスを呼び出して次に何をすべきかを確認し、全体がクラッシュします。EXC_BAD_ACCESSクラスがメモリ内にないため、取得します。

Controllerビデオの再生を開始するように指示した後、何もしないため、ARC がクラスをリリースしていることがわかります。しかし、再び必要になるまで、そのクラスを保持したいと思います。

次のように、このクラスをプロパティとして宣言しています。

@property (strong, nonatomic) Controller * controller;

しかし、それにもかかわらず、ARCは何もしないとすぐにクラスをリリースし続けます。

編集:

このプロパティを App Delegate に移動しました。しかし、ARCはまだそれをリリースしています。このクラスの複数のコピーを持つ可能性が必要なので、これをシングルトンに変えることはできません。

ARC によるオブジェクトの解放を停止したくない場合、どのように停止できますか??

何もしていない間、オブジェクトをメモリに保持することは可能ですか?

これはまったく可能ですか?または、ARC を放棄して、メモリ管理を手動で行う必要がありますか?

4

3 に答える 3

2

Controller独自の有効期間を管理し、アプリ全体に存在するように、シングルトン パターンを使用します。この共有インスタンスは、最初に要求されたときからアプリが終了するまで存在し、ARC はそれを勝手に解放しません。

Controller.h:

@interface Controller : NSObject

+ (Controller *)sharedInstance;

@end

Controller.m:

#import "Controller.h"

static Controller *_instance = nil;
static dispatch_once_t _onceToken = 0;

@implementation Controller

+ (Controller *)sharedInstance {
    dispatch_once(&_onceToken, ^{
        _instance = [[Controller alloc] init];
    });
    return _instance;
}

// You could add this if you want to explicitly destroy the instance:
+ (void)destroy {
    _instance = nil;
    _onceToken = 0;
}
于 2013-10-29T10:08:08.703 に答える
1

sで作業しているときに、このケースに何度か遭遇しましたUITableView。プライベートを作成し@property (strong) id *yourObjectRetain、オブジェクトをそれに割り当てました。複数のオブジェクトの配列も機能します。

于 2013-10-29T13:48:34.740 に答える