0

I am having a application crash when i use back button in UINavigation child and child [supper dealloc] called application get crash. I tried but i am not able to find any error. Instrument saying below issue but i am not getting the point here

#   Address Category    Event Type  RefCt   Timestamp   Size    Responsible Library Responsible Caller
0   0x9e8c8c0   CALayer Malloc  1   00:05.082.180   48  UIKit   -[UIView _createLayerWithFrame:]
1   0x9e8c8c0   CALayer Zombie  -1  00:18.855.037   0   QuartzCore  CA::release_objects(X::List<void const*>*)

if you can help me i will be great thankfull to you.

Here is the root page code

//
//  TNTScenarioViewController.m
//  TurfNutritionTool
//
//  Created by Aashish Joshi on 10/20/11.
//  Copyright 2011 Abacus Consultancy Services. All rights reserved.
//

#import "TNTScenarioViewController.h"
#import "ScenarioDetailViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation TNTScenarioViewController

@synthesize scenarioTable =             _scenarioTable;
@synthesize scenarioDetail =            _scenarioDetail;
@synthesize scenarioId =                _scenarioId;
@synthesize scenarioTableCellStyle =    _scenarioTableCellStyle;
@synthesize dbObject =                  _dbObject;
@synthesize headerDateLabel =           _headerDateLabel;
@synthesize headerTurfAcresLabel =      _headerTurfAcresLabel;
@synthesize headerScenarioIDLabel =     _headerScenarioIDLabel;
@synthesize headerDescriptionLabel =    _headerDescriptionLabel;
@synthesize headerProductTypeLabel =    _headerProductTypeLabel;
@synthesize headerTargetNitrogenLabel = _headerTargetNitrogenLabel;
@synthesize headerView =                _headerView;
@synthesize synchronize =               _synchronize;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    UIColor *_background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"main_login_bg.png"]];
    self.view.backgroundColor = _background;
    [_background release];

    _scenarioTable.delegate = self;
    _scenarioTable.dataSource = self;

    // Set the table view to be rounded
    [[self.scenarioTable layer] setCornerRadius:5.0];

    [self loadDBAccessDatabase];
    // [self didApplicationLaunchedFirstTime];

    self.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIToolbar* _rightNavBarTools = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 260, 44)];

    // create the array to hold the buttons, which then gets added to the toolbar
    NSMutableArray* _rightNavBarButtons = [[NSMutableArray alloc] initWithCapacity:4];

    UIBarButtonItem *_signout = [[UIBarButtonItem alloc] initWithTitle:@"Sign out" style:UIBarButtonItemStyleBordered target:self action:@selector(didApplicationLaunchedFirstTime)];
    [_rightNavBarButtons addObject:_signout];

    [_signout release];

    UIBarButtonItem *_syncronize = [[UIBarButtonItem alloc] initWithTitle:@"Synchronize" style:UIBarButtonItemStyleBordered target:self action:@selector(syncronize)];
    [_rightNavBarButtons addObject:_syncronize];
    [_syncronize release];

    UIBarButtonItem *_addNewScenario = [[UIBarButtonItem alloc] 
                                        initWithTitle:@"New TNT" style:UIBarButtonItemStyleBordered target:self 
                                        action:@selector(startNewScenario)];
    [_rightNavBarButtons addObject:_addNewScenario];
    [_addNewScenario release];

    [_rightNavBarTools setItems:_rightNavBarButtons animated:NO];
    [_rightNavBarButtons release];

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:_rightNavBarTools] autorelease];
    [_rightNavBarTools release];

    [self loadAllScenario];
}

- (void)viewWillAppear:(BOOL)animated
{
    NSLog(@"%d", [self retainCount]);
    [super viewWillAppear:animated];
    [self loadAllScenario];
    [self.scenarioTable reloadData];
}

- (void)viewDidUnload
{
    [_scenarioTable release];
    [_scenarioDetail release];
    [_scenarioId release];
    [_scenarioTableCellStyle release];

    self.scenarioTable = nil;
    self.scenarioDetail = nil;
    self.scenarioId = nil;
    self.scenarioTableCellStyle = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

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

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [self.scenarioId count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        [[NSBundle mainBundle] loadNibNamed:@"scenarioTableCellStyle" owner:self options:nil];
        cell = self.scenarioTableCellStyle;
        self.scenarioTableCellStyle = nil;
    }

    if (indexPath.row % 2 == 0) {
        cell.contentView.backgroundColor = [UIColor colorWithWhite:253.0/255 alpha:1];
    } else {
        cell.contentView.backgroundColor = [UIColor colorWithWhite:250.0/255 alpha:1];
    }


    NSDictionary * _scenarioDetailRow = [self.dbObject getScenarioDetail:[self.scenarioId objectAtIndex:indexPath.row]];

    NSNumber* _tempNumber;
    NSNumberFormatter* _formatter = [[NSNumberFormatter alloc] init];
    NSString* _convertedNumber;

    // Configure the cell...
    _tempNumber = [_scenarioDetailRow objectForKey:@"scenarioid"];
    [_formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    _convertedNumber = [_formatter stringForObjectValue:_tempNumber];

    UILabel* _label = (UILabel *)[cell viewWithTag:1];
    _label.text = _convertedNumber;

    _label = (UILabel *)[cell viewWithTag:2];
    NSString* _turftype = [_scenarioDetailRow objectForKey:@"turf"];
    _label.text = _turftype;

    _label = (UILabel *)[cell viewWithTag:3];
    _tempNumber = [_scenarioDetailRow objectForKey:@"targetnitrogen"];
    [_formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    _convertedNumber = [_formatter stringForObjectValue:_tempNumber];
    _label.text = _convertedNumber;

    _label = (UILabel *)[cell viewWithTag:4];
    _tempNumber = [_scenarioDetailRow objectForKey:@"turfacre"];
    [_formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    _convertedNumber = [_formatter stringForObjectValue:_tempNumber];
    _label.text = _convertedNumber;
    [_formatter release];

    _label = (UILabel *)[cell viewWithTag:5];
    NSString* _dateCreated = [_scenarioDetailRow objectForKey:@"datecreated"];

    NSDateFormatter *inputFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSDate *_inputDateCreated = [inputFormatter dateFromString:_dateCreated];
    NSDateFormatter *outputFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [outputFormatter setDateFormat:@"MM-dd-yyyy"];

    NSString *_outputDateCreated = [outputFormatter stringFromDate:_inputDateCreated];

    _label.text = _outputDateCreated;

    _label = (UILabel *)[cell viewWithTag:6];

    if (([_scenarioDetailRow objectForKey:@"description"] != nil) && ([_scenarioDetailRow objectForKey:@"description"] != (id)[NSNull null])){

        NSString* _discription = [_scenarioDetailRow objectForKey:@"description"];
        _label.text = _discription;

    } else {

        _label.text = [NSString stringWithString:@""];
    }

    return cell;
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    if (UIInterfaceOrientationIsLandscape(fromInterfaceOrientation))
    {
        // Move the plots into place for portrait
        _headerScenarioIDLabel.frame        = CGRectMake(-30, 2, 125, 20);
        _headerDescriptionLabel.frame       = CGRectMake(52, 2, 125, 20);
        _headerProductTypeLabel.frame       = CGRectMake(278, 2, 125, 20);
        _headerTargetNitrogenLabel.frame    = CGRectMake(368, 2, 125, 20);
        _headerTurfAcresLabel.frame         = CGRectMake(437, 2, 125, 20);
        _headerDateLabel.frame              = CGRectMake(545, 2, 125, 20);
    }
    else
    {
        // Move the plots into place for landscape
        _headerScenarioIDLabel.frame        = CGRectMake(-26, 2, 125, 20);
        _headerDescriptionLabel.frame       = CGRectMake(85, 2, 125, 20);
        _headerProductTypeLabel.frame       = CGRectMake(390, 2, 125, 20);
        _headerTargetNitrogenLabel.frame    = CGRectMake(526, 2, 125, 20);
        _headerTurfAcresLabel.frame         = CGRectMake(626, 2, 125, 20);
        _headerDateLabel.frame              = CGRectMake(759, 2, 125, 20);

    }
}


- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

    _headerScenarioIDLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    _headerDateLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    _headerDescriptionLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    _headerProductTypeLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    _headerTargetNitrogenLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
    _headerTurfAcresLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;    
    BOOL isLandscape = UIDeviceOrientationIsLandscape(self.interfaceOrientation);

    if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape)

    {
        // Move the plots into place for landscape
        _headerScenarioIDLabel.frame        = CGRectMake(-26, 2, 125, 20);
        _headerDescriptionLabel.frame       = CGRectMake(85, 2, 125, 20);
        _headerProductTypeLabel.frame       = CGRectMake(390, 2, 125, 20);
        _headerTargetNitrogenLabel.frame    = CGRectMake(526, 2, 125, 20);
        _headerTurfAcresLabel.frame         = CGRectMake(626, 2, 125, 20);
        _headerDateLabel.frame              = CGRectMake(759, 2, 125, 20);
    }

    else
    {
        // Move the plots into place for portrait
        _headerScenarioIDLabel.frame        = CGRectMake(-30, 2, 125, 20);
        _headerDescriptionLabel.frame       = CGRectMake(52, 2, 125, 20);
        _headerProductTypeLabel.frame       = CGRectMake(278, 2, 125, 20);
        _headerTargetNitrogenLabel.frame    = CGRectMake(368, 2, 125, 20);
        _headerTurfAcresLabel.frame         = CGRectMake(437, 2, 125, 20);
        _headerDateLabel.frame              = CGRectMake(545, 2, 125, 20);
    }

    if(_headerView == nil) {
        //allocate the view if it doesn't exist yet
        _headerView  = [[UIView alloc] init];

        UIColor *_background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"toolbar_bkg.png"]];
        _headerView.backgroundColor = _background;
        [_background release];


        _headerScenarioIDLabel.backgroundColor = [UIColor clearColor];
        _headerScenarioIDLabel.opaque = NO;
        _headerScenarioIDLabel.textColor = [UIColor whiteColor];
        _headerScenarioIDLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerScenarioIDLabel.textAlignment = UITextAlignmentCenter;
        _headerScenarioIDLabel.text = @"ID";


        _headerDateLabel.backgroundColor = [UIColor clearColor];
        _headerDateLabel.opaque = NO;
        _headerDateLabel.textColor = [UIColor whiteColor];
        _headerDateLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerDateLabel.textAlignment = UITextAlignmentCenter;
        _headerDateLabel.text = @"Date";


        _headerDescriptionLabel.backgroundColor = [UIColor clearColor];
        _headerDescriptionLabel.opaque = NO;
        _headerDescriptionLabel.textColor = [UIColor whiteColor];
        _headerDescriptionLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerDescriptionLabel.textAlignment = UITextAlignmentCenter;
        _headerDescriptionLabel.text = @"Description";


        _headerProductTypeLabel.backgroundColor = [UIColor clearColor];
        _headerProductTypeLabel.opaque = NO;
        _headerProductTypeLabel.textColor = [UIColor whiteColor];
        _headerProductTypeLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerProductTypeLabel.textAlignment = UITextAlignmentCenter;
        _headerProductTypeLabel.text = @"Product Type";


        _headerTargetNitrogenLabel.backgroundColor = [UIColor clearColor];
        _headerTargetNitrogenLabel.opaque = NO;
        _headerTargetNitrogenLabel.textColor = [UIColor whiteColor];
        _headerTargetNitrogenLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerTargetNitrogenLabel.textAlignment = UITextAlignmentCenter;
        _headerTargetNitrogenLabel.text = @"Target N";


        _headerTurfAcresLabel.backgroundColor = [UIColor clearColor];
        _headerTurfAcresLabel.opaque = NO;
        _headerTurfAcresLabel.textColor = [UIColor whiteColor];
        _headerTurfAcresLabel.font = [UIFont boldSystemFontOfSize:12];
        _headerTurfAcresLabel.textAlignment = UITextAlignmentCenter;
        _headerTurfAcresLabel.text = @"Turf Acres";

        //add the button to the view
        [_headerView addSubview:_headerScenarioIDLabel];
        [_headerView addSubview:_headerDescriptionLabel];
        [_headerView addSubview:_headerProductTypeLabel];
        [_headerView addSubview:_headerTargetNitrogenLabel];
        [_headerView addSubview:_headerTurfAcresLabel];
        [_headerView addSubview:_headerDateLabel];

    }

    //return the view for the footer
    return _headerView;
}
// specify the height of your footer section
- (CGFloat)tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section {
    //differ between your sections or if you
    //have only on section return a static value
    return 24;
}

- (CGFloat)tableView:(UITableView *)tableView
heightForFooterInSection:(NSInteger)section {
    //differ between your sections or if you
    //have only on section return a static value
    return 14;
}

- (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 

    UIColor *_background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"toolbar_bkg.png"]];
    UIView* _customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
    _customView.backgroundColor = _background;
    [_background release];
    return _customView; 
}


/*
 // 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;
 }
 */

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.

     ScenarioDetailViewController* _detailViewController = [[ScenarioDetailViewController alloc] initWithNibName:@"ScenarioDetailViewController" bundle:nil];
     _detailViewController.dbObject = self.dbObject;
     [_detailViewController setScenarioId:[self.scenarioId objectAtIndex:indexPath.row]];
     [self.navigationController pushViewController:_detailViewController animated:YES];
    [_detailViewController release];
}

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    // Updates the appearance of the Edit|Done button as necessary.
    [super setEditing:editing animated:animated];
    [self.scenarioTable setEditing:editing animated:YES];
    // Disable the add button while editing.
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // must update the database before updating the tableView
        // so that the tableView never has a row that's missing from the database
        [self.dbObject deleteScenarioRow:[self.scenarioId objectAtIndex:indexPath.row]];
        [self loadAllScenario];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                         withRowAnimation:UITableViewRowAnimationFade];
        [self.scenarioTable reloadData];
    }   
}

- (void)dealloc {

    [_synchronize release];    
    [_scenarioTable release];
    [_scenarioDetail release];
    [_scenarioId release];
    [_scenarioTableCellStyle release];
    [_headerDateLabel release];
    [_headerTurfAcresLabel release];
    [_headerScenarioIDLabel release];
    [_headerDescriptionLabel release];
    [_headerProductTypeLabel release];
    [_headerTargetNitrogenLabel release];
    [_headerView release];
    [super dealloc];
}

// Called when an alertview button is touched
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    switch (buttonIndex) {
        case 0: 
        {       
            NSLog(@"user not want to sync");
        }
            break;

        case 1: 
        {
            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

            _synchronize = [[TNSynchronize alloc] init];
            _synchronize.delegate = self;
            [_synchronize jesonRequest];

            [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
        }   
            break;
    }
}

- (void) reloadAfterSyncronize {

    [self loadAllScenario];
    [self.scenarioTable reloadData];
}

#pragma mark - TNTScenarioViewController lifecycle methods

- (void) syncronize {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Syncronize process", nil)
                                                    message:NSLocalizedString(@"\n Syncronize process will be start and work in background.", nil)
                                                   delegate:self 
                                          cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
                                          otherButtonTitles:NSLocalizedString(@"Ok", nil), nil];
    [alert show];
    [alert release];
}

- (void) didApplicationLaunchedFirstTime {

    LoginViewController *loginViewObj = [[[LoginViewController alloc] init] autorelease];
    loginViewObj.dbObject = self.dbObject;

    UINavigationController *navigationController = [[[UINavigationController alloc]
                                                     initWithRootViewController:loginViewObj] autorelease];

    navigationController.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentModalViewController:navigationController animated:YES];
} 


- (void)loadSynchronizeController {

    [self.scenarioTable reloadData];
}

// This is Method to New Scenario
- (void) startNewScenario {

    ScenarioDetailViewController* _detailViewController = [[ScenarioDetailViewController alloc] initWithNibName:@"ScenarioDetailViewController" bundle:nil];
    [_detailViewController setScenarioId:[NSNumber numberWithInt:0]];
    [self.navigationController pushViewController:_detailViewController animated:YES];
    // [_detailViewController release];
}

// This Method use for Load Value of Scenario
- (NSMutableArray *) loadAllScenario {
    // NSLog(@"%s", __FUNCTION__);

    // First, test for existence.
    NSArray* _paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* _documentsDirectory = [_paths objectAtIndex:0];
    NSString* _writableConfigPath = [_documentsDirectory stringByAppendingPathComponent:@"Configuration.plist"];
    NSMutableDictionary* _configFile = [[NSMutableDictionary alloc] initWithContentsOfFile:_writableConfigPath];

    NSString* _loginStatus= [NSString stringWithString:[_configFile objectForKey:@"UserEmail"]];
    [_configFile autorelease];

    [self.scenarioId removeAllObjects];

    if (!_dbObject) [self loadDBAccessDatabase];
    self.scenarioId = [NSMutableArray arrayWithArray:[_dbObject getRelatedScenarioArray:_loginStatus]];

    return self.scenarioId;
}

- (NSArray *) loadScenarioIDsIfEmpty {
    // NSLog(@"%s", __FUNCTION__);

    // First, test for existence.
    NSArray* _paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* _documentsDirectory = [_paths objectAtIndex:0];
    NSString* _writableConfigPath = [_documentsDirectory stringByAppendingPathComponent:@"Configuration.plist"];
    NSMutableDictionary* _configFile = [[NSMutableDictionary alloc] initWithContentsOfFile:_writableConfigPath];

    NSString* _loginStatus = [NSString stringWithString:[_configFile objectForKey:@"UserEmail"]];
    [_configFile autorelease];

    if (!_dbObject) [self loadDBAccessDatabase];
    if (!self.scenarioId || ![self.scenarioId count]) self.scenarioId = [NSMutableArray arrayWithArray:[_dbObject getRelatedScenarioArray:_loginStatus]];
    return self.scenarioId;
}

- (DBAccess *) loadDBAccessDatabase {
    // NSLog(@"%s", __FUNCTION__);

    _dbObject = [DBAccess sharedDBObjectAccess];
    return _dbObject;
}

@end

This is the dealloc method as you asked

- (void)dealloc {

    [_scenarioProductTable release];
    [_attributePopover release];
    [_gotMapRegion release];
    [_gotTargetN release];
    [_gotTurfAcres release];
    [_gotTurftype release];
    [_scenarioId release];
    [_granularProductData release]; 
    [_liquidProductData release];
    [_areaGraphData release];
    [_scenarioAppId release];
    [_scenarioProductTableCellStyle release];
    [_scenarioProductTable release];
    [_carryOver release];
    [_tempDiscription release];
    [_scenarioDetailRow release];
    [_turfacresTextField release];
    [_discriptionTextField release];
    [_footerView release];
    [_headerView release];
    [selectedTurftypeLabel release];
    [selectedTargetNLabel release];
    [selectedMapregionLabel release];
    [selectedTurfAcresLabel release];
    [_loginUser release];
    [super dealloc];
}

and in this function it saying that i have the issue

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.

     ScenarioDetailViewController* _detailViewController = [[ScenarioDetailViewController alloc] initWithNibName:@"ScenarioDetailViewController" bundle:nil];
     _detailViewController.dbObject = self.dbObject;
     [_detailViewController setScenarioId:[self.scenarioId objectAtIndex:indexPath.row]];
     [self.navigationController pushViewController:_detailViewController animated:YES];
    [_detailViewController release];
}

and this line have 100% blame in the funnction

[self.navigationController pushViewController:_detailViewController animated:YES];
  • Please highlight the line you get the `Instruments` warning and post the `dealloc` of the last view controller on the navcontroller stack. – A-Live Jul 16 '12 at 14:34

3 Answers3

2

From the crash report, it is apparent that you are overreleasing an object (notice where it says the zombie CALayer has a retain count of -1; anything less than 0 is overreleased). My suggestion is either scour your code until you find it, use the Instruments tool 'Zombies' (which only works when profiling on the Simulator), or upgrade your project to ARC.

I would definitely recommend upgrading to ARC as the best choice. ARC streamlines your code and lowers your peak memory footprint, improving efficiency and greatly reducing the chances of a crash.

Edit:

To upgrade to ARC: (from the Xcode menu)

Edit -> Refactor -> Convert to Objective-C ARC...

(from Apple's Face Detection example project)

enter image description here

Edit 2:

In response to @Chris's answer:

In viewDidUnload you should only release objects that are created in viewDidLoad; also, you should usually only be setting IBOutlets to nil. For every time viewDidUnload is called, viewDidLoad will be called to recreate everything that was destroyed in viewDidUnload. So the lesson is in viewDidUnload, only nil out objects that are created in viewDidLoad. If you release something that isn't created in viewDidLoad, it won't be recreated when you return to that view, which can cause a crash.

Yet I don't think that is your problem here. viewDidUnload is not actually called when a view controller is destroyed (dealloc is called because the controller was popped from the navigation stack or the modal view controller was dismissed). viewDidUnload is only called when the application receives a memory warning- viewDidUnload's job is to release any objects that can be recreated later. Assuming you don't receive any memory warnings and you are just pushing/popping a view controller from the stack, the double release is viewDidUnload is not causing this problem (though it might cause one later).

Moral of the story:

Use ARC. It's not a toy, it really works. It won't 'lessen' your control over memory management- it removes the need for it. Apart from retain cycles (Brad Larson gives a nice explanation here: What kind of leaks does automatic reference counting in Objective-C not prevent or minimize?), ARC will take care of just about all of your memory management, especially leaks. You can still get rid of an object with:

someObject = nil;

so you can still control your memory footprint. @autoreleasepools are also still an option with ARC.

So, final moral of the story:

Use ARC.

Community
  • 1
  • 1
eric.mitchell
  • 8,817
  • 12
  • 54
  • 92
  • No problem, hope that explanation helped! If my answer solved your problem, please mark it as solved (click the check mark next to it). This lets other know that a solution was found to the problem and that they can reference it. Welcome to Stack Overflow! – eric.mitchell Jul 16 '12 at 15:47
  • i removed the ViewDidUnload object but still having the same problem, and i can not use ARC because i have some API like SBjeson and database and they are not come with ARC. – user1529148 Jul 17 '12 at 06:28
  • I got my problem solved but issue was in the child controller dealloc. but thanks you your great response. Thank you all – user1529148 Jul 17 '12 at 06:38
1
- (void)viewDidUnload
{
    [_scenarioTable release];
    [_scenarioDetail release];
    [_scenarioId release];
    [_scenarioTableCellStyle release];

    self.scenarioTable = nil;
    self.scenarioDetail = nil;
    self.scenarioId = nil;
    self.scenarioTableCellStyle = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

Your -viewDidUnload method is double-releasing. First you explicitly release objects by referencing their instance variables, ie: [_scenarioTable release];. But you don't set the ivar to nil after doing that. So those instance variables still point to released objects.

Then you set the properties which are backed by those instance variables to nil. The properties are probably declared as using the retain memory management strategy. This means when you do self.scenarioTable = nil;, it will release the ivar associated with the property.

To fix this, just get rid of the 4 release calls at the top.

- (void)viewDidUnload
{
    self.scenarioTable = nil;
    self.scenarioDetail = nil;
    self.scenarioId = nil;
    self.scenarioTableCellStyle = nil;
    [super viewDidUnload];
}

If you really want to keep those, change it to this:

- (void)viewDidUnload
{
    [_scenarioTable release]; _scenarioTable = nil;
    [_scenarioDetail release]; _scenarioDetail = nil;
    [_scenarioId release]; _scenarioId = nil;
    [_scenarioTableCellStyle release]; _scenarioTableCellStyle = nil;
    [super viewDidUnload];
}

And this is why -viewDidUnload is deprecated in iOS 6.

JimRoepcke
  • 101
  • 5
0

like Rickay said, in your dealloc method and your viewDidUnload you release your 4 scenario objects twice. I've only used ARC but I'm pretty sure thats your issue

Chris Tetreault
  • 1,973
  • 13
  • 19