私は 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
新しいビューをスワップ インおよびスワップ アウトするたびに、ビューのメモリ リークがまだ発生しています。
何か新しい考えはありますか?