ios - Xcode 4.2.1 : UIPickerView causing memory leak, 使用 ARC

标签 ios memory-leaks uipickerview automatic-ref-counting

对于我最近的一个学校项目,我正在创建一个 iPad/iPhone 应用程序。几天来,我一直在处理某个内存泄漏的问题。我的应用程序开始于特定的 View Controller (VCMainStatistics_iPad)。从那里,我推送另一个 View Controller (VCSocialMedia_iPad)。之后,我回到第一个 View Controller 。

当我重复这个序列时,我注意到(通过使用 Instruments - Activity Monitor)应用程序的内存使用量不断增加。通过禁用部分代码,我最终发现它与 pickerView 有关。此代码没有泄漏:

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return 0;
}

但是,当我增加行数时,泄漏开始出现(每行大约 0.07 MB)。显然,这就是为什么我认为 pickerView 是泄漏的原因。我一直在尝试在解除分配之前从 pickerView 中删除 subview ,将 pickerView 设置为 nil,以及许多其他事情......没有什么可以解决问题。为了让事情更清楚一些,我将发布更多代码。

头文件:

#import "UniversalViewController.h"

#define DATATYPE_SOCIALMEDIA 0

@interface VCSocialMedia_iPad : UniversalViewController <UIPickerViewDataSource, UIPickerViewDelegate>
{
    NSArray *lMediaTypes;
    NSMutableArray *lMediaData;

    __weak IBOutlet UIPickerView *pkSocialMedia;
    __weak IBOutlet UILabel *lblGraph;
}

@end

PickerView 委托(delegate)方法:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    // Get key of requested row
    NSString *title = [[lMediaTypes objectAtIndex:row] capitalizedString];

    // Capitalize first letter
    title = [title capitalizedString];

    // Return
    return title;
}



- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // Make or clear data lists
    if( lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] == nil ){
        lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] = [[NSMutableArray alloc] init];
    }
    else{
        [lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] removeAllObjects];
    }

    if( lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] == nil ){
        lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] = [[NSMutableArray alloc] init];
    }
    else{
        [lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] removeAllObjects];
    }

    // Get required key
    NSString *dictKey = [lMediaTypes objectAtIndex:row];

    if( [dictKey isEqualToString:@"total_views"] ){
        return;
    }

    // Adjust graph label
    lblGraph.text = [NSString stringWithFormat:@"Stats from %@", dictKey];

    // Get data of selected row
    NSArray *mediaData = [lMediaData objectAtIndex:row];

    // Add each day to data lists: inversed order
    for( int day = [mediaData count]-1; day >= 0; day-- ){
        NSDictionary *dayData = [mediaData objectAtIndex:day];
        dictKey = @"wpsd_trends_date";

        NSString *date = [dayData objectForKey:dictKey];
        // Remove 00:00:00
        date = [date stringByReplacingOccurrencesOfString:@" 00:00:00" withString:@""];
        [lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] addObject:date];

        dictKey = @"wpsd_trends_stats";
        NSString *stats = [dayData objectForKey:dictKey];
        [lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] addObject:stats];
    }

    // Update the graphs
    [self updateGlobalScreen];
}

PickerView 数据源方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}



- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [lMediaTypes count];
}

解除分配:

- (void)dealloc
{
    pkSocialMedia = nil;
    lblGraph = nil;

    lMediaData = nil;
    lMediaTypes = nil;
}

我最近才将项目转换为 Objective-C ARC,所以这个问题很可能与我缺乏这个概念的经验有关。除此之外,这也是我的第一个 Xcode 项目。希望这里有人可以提供帮助:如果我需要发布更多代码来澄清问题,请告诉我。

提前致谢!

最佳答案

尝试删除 -(void)dealloc 方法。它不应该在您使用 ARC 时实现。如果您不使用 ARC,则需要调用 [super dealloc]

关于ios - Xcode 4.2.1 : UIPickerView causing memory leak, 使用 ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520480/

相关文章:

ios - 用于下载每天更新一次的网页的 URLSessions 或 AlamoFire?

ios - 推送通知到达时如何做一些工作?

iphone - 当点击另一个 UITextField 调出选择器时,键盘不会关闭

ios - XCode Storyboard编辑器中如何设置主视图的背景图片?

angular - 为什么不收集 FormControl#valueChanges 的订阅垃圾?

c - C的内存泄漏检测器?

c++ - 如何从最小堆 C++ 中释放内存

ios - 更改 UIPickerView 中显示的行数

ios - 从 UIPickerView 自定义委托(delegate)和数据源获取选定值

ios - 报告 : YouTube iFrame player crashes in iOS 9. 0.x UIWebView(自 2016-09-02 起)