Correctly Release cell from UITAbleView

2

I would like to know how to correctly release a cell and fix a memory leak I have. and also ask if a memory leak can cause crashing on scrolling if the numbers cell numbers get high?

Here is my cell where the leak is coming from any suggestions?

NSString *identifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if (cell == nil) {



}


//add subtitle
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
reuseIdentifier:@"cell"];




  /*
  //Here it adds a nice shadow to the table view but will crash on rotation and send a 
  wierd dump to ApplistViewController !!!???? 
  tableView.layer.shadowColor = [[UIColor blackColor] CGColor];
  tableView.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
  tableView.layer.shadowRadius = 8.0f;
  tableView.layer.shadowOpacity = 1.0f;     
  */


[cell.textLabel setNumberOfLines:1];
[cell.textLabel setText:[(Tweet*)[authors objectAtIndex:indexPath.row] author]];  

[cell.detailTextLabel setText:[(Tweet*)[tweets objectAtIndex:indexPath.row] tweet]];
[cell.detailTextLabel setNumberOfLines:10];
[cell.textLabel setTextColor:[UIColor darkGrayColor]];
[cell.textLabel setShadowColor:[UIColor whiteColor]];
[cell.textLabel setShadowOffset:CGSizeMake(0.5, 0.5)];
[cell.detailTextLabel setTextColor:[UIColor blackColor]];
//[cell.detailTextLabel setText:[(Tweet*)[retweetCount objectAtIndex:indexPath.row] 
reTweetCount]];
[cell.textLabel setUserInteractionEnabled:YES];
[cell.contentView setMultipleTouchEnabled:YES];
// cell.text = [[NSString alloc] initWithFormat:@"Cell :%i", indexPath.row];    





 NSURL *url = [NSURL URLWithString:[(Tweet*)[avatarsURL 
 objectAtIndex:indexPath.row]avatarURL]];
 NSData *data = [NSData dataWithContentsOfURL:url];
 // NSLog(@"http://a0.twimg.com/profile_images/1268205919/iDD_normal.png");  
 UIImage *tableImage = [[UIImage alloc] initWithData:data]; 
 [cell.imageView setImage:tableImage]; 
 cell.imageView.image = tableImage ;
 CGSize imageSize = CGSizeMake(45,45);  
 UIGraphicsBeginImageContext(imageSize); 
 CGRect imageRect = CGRectMake(0.2, 0.1, imageSize.width, imageSize.height); 
 [tableImage drawInRect:imageRect]; 
 cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
 UIGraphicsEndImageContext();    







//PlaceMent avatars! would like to use a if statment to place this image in the cell if 
before it retrives the avatar just like the method above for the profile!

/*
 NSString *avatar = [[NSBundle mainBundle] pathForResource:@"avatar" ofType:@"png"];
 UIImage *setAvatar = [[UIImage alloc] initWithContentsOfFile:avatar];

 //now place avatar in cell
 cell.imageView.image = setAvatar;
 */    

 //add gradient to cell 
 UIImage *gradient = [UIImage imageNamed:@"gradientcell2.png"];
 UIImageView *cellimage = [[UIImageView alloc] initWithImage:gradient];
 cellimage.contentMode = UIViewContentModeScaleToFill;
 cell.backgroundView = cellimage;


  [cellimage release];      



UIImage *selectedGradient = [UIImage imageNamed:@"selectedcell.png"];

UIImageView *selectedCell = [[UIImageView alloc] initWithImage:selectedGradient];
selectedCell.contentMode = UIViewContentModeScaleToFill;
cell.selectedBackgroundView = selectedCell;    

//subtitle if needed !! Also change UITableViewStlyle from default to Subtitle up 7 
lines
// cell.detailTextLabel.text = @"subtile";



//yeah another warning within the tableview whats new =P
[tableView setBackgroundColor:[UIColor clearColor]];     


return cell;


[cell autorelease];
}

ALL the LEAKS are fixed!!!! Thank You but why do I crash when I add a count integer ?

Any Suggestions?

2011-06-01 18:24:55.663 ThemeCatcher[4641:207] *** Terminating app due to uncaught    
exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 16 
beyond bounds [0 .. 15]'
*** Call stack at first throw:
(
0   CoreFoundation                      0x014dcbe9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x016315c2 objc_exception_throw + 47
2   CoreFoundation                      0x014d26e5 -[__NSArrayM objectAtIndex:] +  
261
3   ThemeCatcher                        0x00025833 -[TwitterVeiwController 
tableView:cellForRowAtIndexPath:] + 531
4   UIKit                               0x007bb7fa -
[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634
5   UIKit                               0x007b177f -
[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
6   UIKit                               0x007c6450 -
[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
7   UIKit                               0x007be538 -[UITableView layoutSubviews] + 
242
8   QuartzCore                          0x00460451 -[CALayer layoutSublayers] + 181
9   QuartzCore                          0x0046017c CALayerLayoutIfNeeded + 220
10  QuartzCore                          0x0045937c 
_ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
11  QuartzCore                          0x004590d0 _ZN2CA11Transaction6commitEv +   
292
12  QuartzCore                          0x004897d5 
_ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
13  CoreFoundation                      0x014bdfbb 
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
14  CoreFoundation                      0x014530e7 __CFRunLoopDoObservers + 295
15  CoreFoundation                      0x0141bbd7 __CFRunLoopRun + 1575
16  CoreFoundation                      0x0141b240 CFRunLoopRunSpecific + 208
17  CoreFoundation                      0x0141b161 CFRunLoopRunInMode + 97
18  GraphicsServices                    0x01efa268 GSEventRunModal + 217
19  GraphicsServices                    0x01efa32d GSEventRun + 115
20  UIKit                               0x0075642e UIApplicationMain + 1160
21  ThemeCatcher                        0x000021c9 main + 121
22  ThemeCatcher                        0x00002145 start + 53
23  ???                                 0x00000001 0x0 + 1

)

terminate called after throwing an instance of 'NSException'
Current language:  auto; currently objective-c
(gdb) 
uitableview
asked on Stack Overflow Jun 1, 2011 by FreeAppl3 • edited Jun 1, 2011 by FreeAppl3

2 Answers

0
  1. cell object needs to be autoreleased here – cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; and this line needs to be inside if ( cell == nil ) { //here }.
  2. You alloc-init tableImage but do not release it.
  3. selectedCell is not released either.
  4. You are autoreleaseing after returning from the method. This won't happen and in case of reusable cell, it will send an additional release message crashing your app.

There seem to more issues within your comments which I have chosen not to include. Try using the Leaks application to check for memory leaks.

answered on Stack Overflow Jun 1, 2011 by Deepak Danduprolu
0

when you write the below code in cellForRowAtIndex just autorelease it. your problem solved.

static NSString *cellIdentifier = @"cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if(cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellSeparatorStyleSingleLine reuseIdentifier:cellIdentifier] autorelease];
}
answered on Stack Overflow Oct 10, 2012 by Ankit Jain

User contributions licensed under CC BY-SA 3.0