iOSは初めてで、メモリ管理と計測器を理解するために最善を尽くしています。
私の問題は、ピッカービューを追加/削除すると、奇妙なメモリ損失が発生することです。2つのボタンで構成される非常に基本的な例を設定しました。1つはピッカーを作成して表示します。もう1つは、メインビューから削除します。
アナライザーはクリーンに起動し、Instrumentsは明らかなリークを報告しません。しかし、この「表示と非表示」操作を繰り返すと、ヒープメモリは増え続けます。
これがコードです。私はXCode4.5を使用しており、ARCが有効になっています。
私のViewController.h:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>
@property (nonatomic,strong) UIPickerView *myPickerView;
- (IBAction)pickerButtonPressed:(id)sender;
- (IBAction)freeButtonPressed:(id)sender;
@end
ViewController.m:
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)pickerButtonPressed:(id)sender {
NSLog(@"Tap");
// create picker view on first button tap
UIPickerView* newPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(20, 20,160, 160)];
newPicker.dataSource = self;
newPicker.delegate = self;
newPicker.showsSelectionIndicator = YES;
self.myPickerView = newPicker;
[self.view addSubview:newPicker];
}
- (IBAction)freeButtonPressed:(id)sender {
NSLog(@"Free");
// remove from view and release
[self.myPickerView removeFromSuperview];
self.myPickerView = nil;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return 5;
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return @"Meh";
}
@end
InstrumentsショーのオブジェクトリストはUIPickerView
、反復ごとにうまく行き来するため、正しく割り当てが解除されているように見えます。まあ、完全ではありません。これは、ヒープショットからのサンプルです。
(申し訳ありませんが、まだ画像を投稿することはできません)
さて、私が実際にピッカービューを正しく解放している場合(ビューから削除してその参照をnilに設定している場合)、それらの割り当てはどこから来ますか?
ちなみに、スタックトレース上のものは、それUIPickerTableViewTitledCell
を含むピッカービューのリークで同様の問題を抱えている人がいるため、疑わしいと思います(これとこれを参照)が、私は自分の頭や尾を作ることができませんこれでやるべきだ。それらが実際に私の問題に関連しているかどうかはわかりませんが、運が良ければ正しい方向を向いている可能性があります。
任意のヒント?