iOS 新手,尽我所能掌握内存管理和 Instruments。
我的问题是添加/删除pickerview 时出现奇怪的内存丢失。我已经设置了一个非常基本的示例,其中包含两个按钮:一个创建并显示选择器。另一个将其从主视图中删除。
分析仪干净,仪器没有报告任何明显的泄漏。但是 - 当我重复这个“显示和隐藏”操作时,堆内存继续增长。
这是代码。我在 XCode 4.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
视图控制器.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
每次迭代都很好,所以看起来它被正确地释放了。嗯,不完全是。这是来自 heapshot 的示例:
(对不起,我还不允许发布图片)
现在,如果我实际上正确地释放了pickerview(从视图中删除并将其引用设置为nil)这些分配来自哪里?
在旁注中-UIPickerTableViewTitledCell
堆栈跟踪上的那件事让我感到怀疑,因为有些人在泄漏涉及该问题的pickerviews方面遇到了类似的问题(请参阅this和this one),但是我无法确定自己是什么应该与此有关。不确定它们是否真的与我的问题有关,但如果运气好的话,它们可能会指向正确的方向。
有小费吗?