2

私は Apple の Instruments "Allocations" ツールを使用していましたが、2 つのビューの間を行ったり来たりすると、割り当てが常に大きくなることに気付きました。調査したところ、すべてのメモリが UIViewController の UIView のサブビューであるオブジェクトからのものであることがわかりました。

確認したところ、UIViewController の割り当てが解除されていますが、明らかに UIView はそうではありませんか? UIViewコントローラーとは別にUIViewを保持していません。誰にもアイデアはありますか?

ビューを切り替えるために書いたコードは次のとおりです。

UISubViewController *viewController = [UIViewControllerFactory createViewController:viewControllerID];     // Creates and returns a UIViewController by ID

[currentViewController viewWillDisappear:YES];
[currentViewController.view removeFromSuperview];
[currentViewController viewDidDisappear:YES];

[viewController viewWillAppear:YES];
[self.view insertSubview:viewController.view atIndex:0];
[viewController viewDidAppear:YES];

self.currentViewController = viewController;
[viewController release];

編集:
わかりました、ViewController のビューを使用してから ViewController を解放するだけであるという懸念があったため、NIB でファイルの所有者であるが NSObject から継承する新しいクラスを作成する実験を試みました。

コードは次のようになります。

MyView *myView = [[MyView alloc] initWithNibName:@"myView"];

[currentView viewWillDisappear:YES];
[currentView.view removeFromSuperview];
[currentView viewDidDisappear:YES];

[myView viewWillAppear:YES];
[self.view insertSubview:myView.view atIndex:0];
[myView viewDidAppear:YES];

self.currentView = myView;
[myView release];

MyView のイニシャライザは次のようになります。

@interface MyView : NSObject {
    IBOutlet UIView *view;
    NSArray *nibTopLevelObjects;
}

@property (nonatomic, retain) UIView *view;

- (id)initWithNibName:(NSString *)nibName;

@end


@implementation MyView

@synthesize view;

- (id)initWithNibName:(NSString *)nibName {
    if (self = [super init]) {

        nibTopLevelObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
        [nibTopLevelObjects retain];
    }
    return self;
}

- (void)dealloc {
    [view release];
    [nibTopLevelObjects release];

    view = nil;
    nibTopLevelObjects = nil;

    [super dealloc];
}

@end

新しいビューをスワップ インおよびスワップ アウトするたびに、ビューのメモリ リークがまだ発生しています。

何か新しい考えはありますか?

4

2 に答える 2

0

ファクトリはviewControllerを返しますが、新しいコントローラーをプッシュするのではなく、ビューを追加するだけです。この場合、ビューを作成しないのはなぜですか?

あなたがやっていることは、 self.currentViewController ivar を解放せずに継続的に上書きすることです。そのView Controllerが所有するビューを解放しているかもしれませんが、それだけです。

currentViewController は次のように定義されていますか

@property (nonatomic, retain) UISubViewController* currentViewController;

多分?その場合、リリースと一致しない保持があります - 上書きする前に self.currentViewController を解放することはありません。self.プロパティがそのように定義されていても、使用しないと保持されません。

于 2010-11-09T22:01:03.363 に答える
0

古いビューを正しく削除して、新しいビューを追加しています。これは、SubViewController のどこかで誤ってビューを保持しているか、デバイスではなくシミュレーターでテストしていることを意味します。

SubViewController のコードを投稿して、そこで何が起こっているかを確認できますか?

また、実際のデバイスでテストした場合と同じ結果が得られますか?


PS Adam Eberbach は公正な論点を提起します - ビューを盗んで解放するためだけにわざわざビュー コントローラを作成するのはなぜですか?

于 2010-11-09T23:38:19.533 に答える