gpt4 book ai didi

iphone - 令人困惑的 iPhone 应用程序中的双重免费错误消息/内存泄漏

转载 作者:行者123 更新时间:2023-11-28 17:40:50 25 4
gpt4 key购买 nike

编辑 - 添加 .h 文件

我很难找到双重释放错误的原因。

解决的步骤

1) 使用僵尸工具。 Zombies 报告 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

最佳答案

试试这个....

- (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];
}

关于iphone - 令人困惑的 iPhone 应用程序中的双重免费错误消息/内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com