3

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方面遇到了类似的问题(请参阅thisthis one),但是我无法确定自己是什么应该与此有关。不确定它们是否真的与我的问题有关,但如果运气好的话,它们可能会指向正确的方向。

有小费吗?

4

0 回答 0