утечка памяти со сборщиком? (приложение для iphone) - PullRequest
0 голосов
/ 01 апреля 2010

Я работаю над представлением, которое выбирает изображение (диаграмму) на основе пользовательского ввода через зависимый инструмент выбора, который использует файл plist, который содержит три массива, содержащих около 40 строк в каждом.

Примерно в 50% случаев, когда я запускаю приложение, оно просто сразу выключается, но в остальное время оно работает, оно будет работать нормально, пока я не начну прокручивать средство выбора, и в этот момент оно падает примерно через 4 секунды , Также не будет отображаться одно из имен массивов в левом компоненте.

Я попытался запустить приложение с анализатором, чтобы проверить утечку памяти, но оно вообще не запустится, если я использую анализатор в режиме утечки памяти. Код почти прямо из книги.

Вот соответствующий код:

    -(void) viewDidLoad {
        [super viewDidLoad];
        UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"US High Index.jpg"]];
        self.imageView = tempImageView;
        NSString *string = @"US High Index";
        self.chartNameLabel.text = string;
        [string release];
        [tempImageView release];


    scrollView.contentSize = CGSizeMake(imageView.frame.size.width , imageView.frame.size.height);
    scrollView.maximumZoomScale = 4.0;
    scrollView.minimumZoomScale = .05;
    scrollView.clipsToBounds = YES;
    scrollView.delegate = self;

    [scrollView addSubview:imageView];

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *plistPath = [bundle pathForResource:@"ChartTypes" ofType:@"plist"];

    NSDictionary *dictionary = [[NSDictionary alloc]initWithContentsOfFile:plistPath];

    self.chartsDictionary   = dictionary;


    NSArray *components = [self.chartsDictionary allKeys];
    self.chartTypes = components;


    NSString *selectedChartType = [self.chartTypes objectAtIndex:0];
    NSArray *array = [chartsDictionary objectForKey:selectedChartType];
    self.charts = array;

    [dictionary release];
    [array release];

    [selectedChartType release];
    [plistPath release];
    [bundle release];
}



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

    -(NSInteger)pickerView:(UIPickerView *)pickerView
    numberOfRowsInComponent:(NSInteger)component {
        if (component == kChartTypeComponent ) 
            return [self.chartTypes count];

            return [self.charts count];

    }

    #pragma mark Picker delegate methods
    -(NSString *)pickerView:(UIPickerView *)pickerView
    titleForRow:(NSInteger)row
               forComponent:(NSInteger)component {
        if (component == kChartTypeComponent ) 
            return [self.chartTypes objectAtIndex:row];

            return [self.charts objectAtIndex:row];



    }

    -(void)pickerView:(UIPickerView *)pickerView
          didSelectRow: (NSInteger)row
          inComponent:(NSInteger)component {
        if (component == kChartTypeComponent ) {
            NSString *selectedChartType = [self.chartTypes objectAtIndex:row];
            NSArray *array = [chartsDictionary objectForKey:selectedChartType];
            self.charts = array;
            [picker selectRow: 0 inComponent:kChartComponent animated: YES];
            [picker reloadComponent:kChartComponent];

        }
        }

1 Ответ

3 голосов
/ 01 апреля 2010

Я думаю, вам не нужно звонить

[array release];
[selectedChartType release];

в вашем методе viewDidLoad, потому что оба объекта автоматически освобождены. Может быть, это может привести к аварии.

...