Непонятное двойное сообщение об ошибке / утечка памяти в приложении для iPhone - PullRequest
1 голос
/ 19 ноября 2011

РЕДАКТИРОВАТЬ - добавлен .h файл

У меня проблемы с поиском причины ошибки двойного освобождения.

Шаги, предпринятые для решения

1) Использовал инструмент Зомби.Зомби сообщают, что tid освобождается дважды

2) Установите точку останова для malloc_error_break.Это идентифицировало следующий сегмент кода как неисправный:

 - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];

        [connection release];

        [ldestination release];
        [ldeparts_from release];
        [ltime release];
        [lcs_id release]; /// It breaks here


        [carsharexml release];
    }

3) Я просмотрел код, чтобы увидеть, где у меня был [lcs_id release] раньше - я ничего не нашел.

4) В отчаяниипопытку ее решить я закомментировал [lcs_id release].Это остановило сообщения об ошибках double free, но когда я проверил его через утечки, он сказал, что это вызывает утечки памяти.

Что я делаю не так?

Большое спасибо.

Ниже приводится полная копия кода:

#import <UIKit/UIKit.h>
#import "MyManager.h"

@interface ListOfCarShares : UITableViewController <NSXMLParserDelegate>
{
    NSURLConnection *connection;
    NSMutableData *carsharexml;
    NSMutableArray *ldestination;
    NSMutableArray *ldeparts_from;
    NSMutableArray *lcs_id;
    NSMutableArray *ltime;
    NSMutableString *currentElement;

    NSMutableString *tdest;
    NSMutableString *tfrom;
    NSMutableString *ttime;
    NSMutableString *tid;



}

-(void)fetchcarshares;

@property (nonatomic, assign) IBOutlet UITableViewCell *maincell;


@end


//
//  ListOfCarShares.m
//  Warwick_Culture
//
//  Created by Me on 26/10/2011.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "ListOfCarShares.h"

@implementation ListOfCarShares

@synthesize maincell;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}



- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    currentElement = [[elementName copy] autorelease];
    if ([elementName isEqualToString:@"destination"]) 
    {

        //NSLog(@"found current conditions tag it reads %@",currentElement);
        tdest = [[NSMutableString alloc] init];
    }

    if ([elementName isEqualToString:@"departs_from"])
    {
        tfrom = [[NSMutableString alloc] init]; 
    }


    if ([elementName isEqualToString:@"time"])
    {
        ttime = [[NSMutableString alloc] init]; 
    }

    if ([elementName isEqualToString:@"cs_id"])
    {
        tid = [[NSMutableString alloc] init]; 
    }



}




- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{

    if ([currentElement isEqualToString:@"destination"])
    {

        [tdest appendString:string];
    }

    if ([currentElement isEqualToString:@"departs_from"])
    {

        [tfrom appendString:string];
    }

    if ([currentElement isEqualToString:@"time"])
    {

        [ttime appendString:string];
    }

    if ([currentElement isEqualToString:@"cs_id"])
    {

        [tid appendString:string];
    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

    if ([currentElement isEqualToString:@"destination"])
    {

        [ldestination addObject:tdest];
        [tdest release];

    }

    if ([currentElement isEqualToString:@"departs_from"])
    {

        [ldeparts_from addObject:tfrom];
        [tfrom release];
    }

    if ([currentElement isEqualToString:@"time"])
    {

        [ltime addObject:ttime];
        [ttime release];
    }

    if ([currentElement isEqualToString:@"cs_id"])
    {

        [lcs_id addObject:tid];
        [tid release];
    }



}





- (void)didReceiveMemoryWarning
{

    [super didReceiveMemoryWarning];


}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)viewDidUnload
{
    [super viewDidUnload];

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    ldestination = [[NSMutableArray alloc] init];

    ldeparts_from = [[NSMutableArray alloc] init];
    ltime = [[NSMutableArray alloc] init];
    lcs_id = [[NSMutableArray alloc] init];
    carsharexml = [[NSMutableData alloc] init];

    [self fetchcarshares];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [connection release];

    [ldestination release];
    [ldeparts_from release];
    [ltime release];
    [lcs_id release]; ///


    [carsharexml release];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];


}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [ltime count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
    if (cell == nil) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"carsharecell" owner:self options:nil];

    }

    // Configure the cell...
    cell=maincell;

    UILabel *from;
    UILabel *dest;
    UILabel *time;

    from = (UILabel *)[cell viewWithTag:4];
    dest = (UILabel *)[cell viewWithTag:5];
    time = (UILabel *)[cell viewWithTag:6];


    from.text=[ldeparts_from objectAtIndex:indexPath.row];
    dest.text=[ldestination objectAtIndex:indexPath.row];
    time.text=[ltime objectAtIndex:indexPath.row];


    return cell;
}

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

-(void)fetchcarshares
{

    MyManager *sharedManager = [MyManager sharedManager];




    NSString *urlString = [NSString stringWithFormat:@"http://url/get.php?username=%@&password=%@",sharedManager.user,sharedManager.passw];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];

    connection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];


}

-(void) connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
    [carsharexml appendData:data];
}


-(void) connectionDidFinishLoading:(NSURLConnection *)conn
{
    NSString *xmlcheck = [[NSString alloc] initWithData:carsharexml encoding:NSUTF8StringEncoding];

    NSLog(@"%@",xmlcheck);

    [xmlcheck release];






    NSXMLParser *parser = [[NSXMLParser alloc] initWithData: carsharexml];

    [parser setDelegate:self];

    [parser parse];

    [parser release];








    [[self tableView] reloadData];




}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 102;
}



#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

}

-(void)dealloc
{
    [super dealloc]; 
}

@end

Ответы [ 3 ]

0 голосов
/ 19 ноября 2011

если свойство lcs_id не определено как сохраняемое, вам нужно заменить строку

 lcs_id = [[NSMutableArray alloc] init];

на

lcs_id = [[[NSMutableArray alloc] init] retain];

, иначе другой обходной путь будет в

- (void)viewWillDisappear:(BOOL)animated
    {
       if(lcs_id)
       {
              [lcs_id release];
              lcd_id = nil;
       }
}
0 голосов
/ 19 ноября 2011

При возникновении проблемы, пожалуйста, проверьте ниже пункт 1. Пожалуйста, убедитесь, что вы не использовали [autorelease] для объекта lcs_id 2. Самое главное, если вы использовали эту же переменную на других страницах приложения, вы получили сообщение об ошибке выше.

пожалуйста, попробуйте

[this.lcs_id release] Ваша ошибка будет устранена.

0 голосов
/ 19 ноября 2011

Попробуйте это ....

- (void)viewWillAppear:(BOOL)animated
  {
    [super viewWillAppear:animated];

    ldestination = [[[NSMutableArray alloc] init]retain];

    ldeparts_from = [[[NSMutableArray alloc] init]retain];
    ltime = [[[NSMutableArray alloc] init]retain];
    lcs_id = [[[NSMutableArray alloc] init]retain];
    carsharexml = [[[NSMutableData alloc] init]retain];

    [self fetchcarshares];
 }
...