每次我旋转组件时,UIPickerView 似乎都在泄漏

Posted

技术标签:

【中文标题】每次我旋转组件时,UIPickerView 似乎都在泄漏【英文标题】:UIPickerView seems to be leaking each time I rotate a component 【发布时间】:2012-03-20 15:53:36 【问题描述】:

更新:

在我看来,这几乎是 Apple 的错误。我尝试了以下方法:

    创建一个新的单窗口项目 创建一个如下所示的单个 UIPickerView,只是 选择器只允许转动刻度盘。也就是说,既不变量 与选择器交互时,也不会操纵任何状态。

结果: 无论我使用简单的 titleForRow:forComponent 还是 viewForRow:forComponent,每次转动转盘时,选择器仍然会泄漏 48 个字节。此外,我什至尝试让选择器返回先前分配在数组中的视图,该数组设置为 viewController 中的类属性,因此不会保留或释放视图,但无论选择器在调用委托方法之后或之前可能在内部做什么。仍然会发生泄漏。

对我来说似乎是 Apple 的错误。

原始问题

我有一个 textField,其 imputView 设置为具有 4 个组件的 UIPickerView。选择器用于选择成为 textField 中文本的重量/质量。

在 Instruments 下,每次在 UIPickerView 中转动转盘/组件,都会发生泄漏:

这是 48 字节泄漏的堆栈跟踪:

UIPickerView获取各个组件视图的代码是:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view

    if(!view)
    
        view = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 37)] autorelease];
        UILabel *label = (UILabel*)view;
        label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        label.textAlignment = UITextAlignmentCenter;
        label.font = [UIFont boldSystemFontOfSize:24];
        label.backgroundColor = [UIColor clearColor];
    

    ((UILabel*)view).text = [NSString stringWithFormat:@"%@%i", ((component == 3) ? @"." : @""), row];
    return view;


- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component

    return  60;

将 textField 更新为新文本值的代码是:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    NSString *newWeight = [NSString stringWithFormat:@"%i%i%i.%i", 
                           [pickerView selectedRowInComponent:0], 
                           [pickerView selectedRowInComponent:1],
                           [pickerView selectedRowInComponent:2],
                           [pickerView selectedRowInComponent:3]];

    self.sampleMassBuffer = [NSDecimalNumber decimalNumberWithString:newWeight];
    weightTextField.text = [[numberFormatter stringFromNumber:self.sampleMassBuffer] stringByAppendingFormat:@" %@", currentConfiguration.weightUnits];

我不知道泄漏是如何产生的,也不知道它们是否是我的! 会不会是 Apple 的 bug?

【问题讨论】:

可能与您的问题无关,但如果您只是制作普通标签,为什么不使用 titleForRow:inComponent: 而不是 view? 我在您发布的代码中没有发现任何漏洞。 currentConfiguration.weightUnits 看起来像什么?还是sampleMassBuffer?您是否自己为这些属性实现了 setter / getter?泄漏可能在那里。 currentConfiguration.weightUnits 是一个 NSManagedObject(核心数据),由实现模型/控制器桥的单例所有。所以它在整个应用程序生命周期中都是活跃的;它甚至没有被分配过,我只是在调用 getter,如你所见。而self.sampleMassBuffer是一个保留的NSDecimalNumber,正如你所看到的,我正在做self.sampleMassBuffer = new_val,所以希望这转化为1 - [sampleMassBuffer release],2 - sampleMassBuffer = nil,3 - sampleMassBuffer = [new_val retain ]。所以我不知道那里有泄漏 currentConfiguration.weightUnits 是一个 NSManagedObject(核心数据)...我的意思是 currentConfiguration 是一个在整个应用程序中持续存在的 NSManagedobject。 weightUnits 是一个恰好是 NSString 的属性。但仍然......我不会以任何方式更改属性。 【参考方案1】:

我不确定这个问题是否可以回答,只是说您应该使用您的基本示例项目向 Apple 提交错误报告。

【讨论】:

是的,我想是的。但只是想确保我没有忽略任何东西...... 这里好像也有类似的情况报道:***.com/questions/9757956/…【参考方案2】:

SDK 中的漏洞。我刚刚向可信来源确认。

【讨论】:

以上是关于每次我旋转组件时,UIPickerView 似乎都在泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如果我在选择器旋转时使用完成按钮关闭 UIPickerview 的操作表,则获取空值

在这种情况下,如何重用 UIPickerView 中的视图?

UIPickerView:旋转时获取行值?

更新 UIPickerView 中的内容

UIPickerView 的 selectedRowInComponent 仅在旋转且未选中时返回随机行。怎么了?

每次 iPhone 旋转时 iframe 都会向下移动