0

私はiPad用のアプリで働いています。いくつかのビューが表示されるので、メモリ管理に注意する必要があります。

私の問題は自動解放オブジェクトに関連しています。NSAutoreleasePoolを各ViewControllerに関連付けたいと思います。このようなもの:

MyViewController.h

@interface MyViewController: UIViewController

@property (nonatomic, retain) NSAutoreleasePool *myPool;

MyViewController.m

@implementation MyViewController

@synthesize myPool;

- (void) viewDidLoad {
    myPool = [[NSAuroteleasePool alloc] init];    
}


- (void) dealloc {
    [myPool drain];
}

NSAutoreleasePoolをプロパティとして使用することはできません。このような振る舞いを実現したいと思います。何か案が?前もって感謝します。

編集

ご回答ありがとうございます。あなたの質問に答えて(私はまだ私の質問に答えることができません):

viewControllerは、さらに多くのことを実行し、イベントなどに応答します。私が望むのは、これらすべての操作の後で、自動解放されるべきものを解放することです。例を拡張する:

MyViewController.h

@interface MyViewController: UIViewController

@property (nonatomic, retain) NSAutoreleasePool *myPool;

MyViewController.m

@implementation MyViewController

@synthesize myPool;

- (void) viewDidLoad {
    myPool = [[NSAuroteleasePool alloc] init];    
}


- (IBAction) whatEver: (id) sender {
    UIImage *img = [UIImage imageWithData: ...];
    NSString *str = @"MyString";
    ...
}

- (void) dealloc {
    [myPool drain];
}

ここで、文字列と画像はどうなりますか?プールに残っていると思いますよね?mainメソッドでリリースプールを待つこともできますが、アプリケーションが終了すると解放されると思います。

4

3 に答える 3

2

このような場合、ローカル自動解放プールを作成する必要はまったくありません。自動解放プールがどのように機能するか知っていますか? 正確に何を達成しようとしていますか?

(質問を編集した後。)ああ、なるほど。Cocoa のメモリ管理を理解していない場合は、ガイドをお読みください。各実行ループの反復後にメインの自動解放プールが空になるため、ローカルの自動解放プールがまったく役に立たなくなります。カスタムの自動解放プールが必要になることはめったにありません。ほとんどの場合、ループ内で多くのオブジェクトを作成する場合や、独自のスレッドで何かを実行している場合です。

手短に言えば、追加の自動解放プールを忘れれば、すべてが正常に機能します。

于 2011-09-29T07:25:50.530 に答える
1

これは非常に悪い考えです。まず、自動解放プールの使用とメモリ管理ポリシーをお読みください 。

于 2011-09-29T07:32:49.173 に答える
0

NSAutoreleasepool がある main.m ファイルで Local autorelease pool.in を作成する必要はありません。

于 2011-09-29T07:55:59.513 に答える