PDA

View Full Version : Broke My UITableViewCell, Can't Fix It! :(




Littleodie914
Apr 9, 2008, 07:27 AM
Hey guys, this is more a shot in the dark than anything else, I made a few changes to my UITableViewCell code, and began receiving the following error *after a value was added to the tableview, and after it was told to reload data.*

The sequence is:

1) Modal window opens
2) User clicks a "create" button"
3) The creation, addition, and data reloading occurs
4) The tableview "below" the modal window is re-displayed

Problem 4 is where the error occurs, but since there's no user-accessible code to trace through and find the error, I'm a bit stuck. Here's what I'm getting:

Code Type: X86 (Native)
Parent Process: launchd [112]

Date/Time: 2008-04-09 08:23:39.342 -0400
OS Version: Mac OS X 10.5.2 (9C7010)
Report Version: 6

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000fffffffc
Crashed Thread: 0

Thread 0 Crashed:
0 UIKit 0x30c70a4d -[UITableViewRowData rectForRow:inSection:] + 188
1 UIKit 0x30b5110f -[UITableView(_UITableViewPrivate) _adjustExtraSeparators] + 392
2 UIKit 0x30b47bab -[UITableView layoutSubviews] + 110
3 QuartzCore 0x0018070b -[CALayer layoutSublayers] + 50
4 QuartzCore 0x00180635 CALayerLayoutIfNeeded + 172

Do you guys know of any way to debug this error, or to figure out which of the arguments being passed to the UITableViewRowData object are problematic? Or what values are being passed back at all? Thanks! :D



Spike099
Apr 9, 2008, 07:48 AM
Whenever i've seen the EXEC_BAD_ACCESS, it's been caused by myself releasing and freeing an object too soon, and later trying to access/send it a message. My advice is to check your properties, make sure their retained properly and of course released when they need to be.

cmaier
Apr 9, 2008, 08:46 AM
it would be a lot easier to diagnose if you showed us the interesting bits of code.

Littleodie914
Apr 9, 2008, 09:42 AM
it would be a lot easier to diagnose if you showed us the interesting bits of code.That's the thing, this is "internal" code. I have no access to the line of code where the error occurs, thus I have no access to the variables being passed to the rectForRow:inSection: method.

That's what I'm ultimately trying to determine: Is there any way to view this section of code, or debug it in any way?

Edit: As a bit more clarification, there's a "Done" button at the top of my modal window, which when pressed, executes the following code:

- (void)createSubject:(id)sender {
NSLog(@"1");
if ([titleTextField text] != nil)
[tempSubject setTitle:[titleTextField text]];
else
[tempSubject setTitle:@"New Subject"];
NSLog(@"2");
if ([noteTextField text] != nil && [noteTextField text] != @"" && [noteTextField text] != @" ")
[tempSubject setNote:[noteTextField text]];
NSLog(@"3");
[tempSubject setHue:[colorSlider value]];
[tempSubject setAssignments:[[NSMutableArray alloc] init]];
NSLog(@"4");
[APP_DELEGATE.subjects addObject:tempSubject];
NSLog(@"5");
[[((IPM_SubjectsViewController *)[[APP_DELEGATE.firstNavigationController viewControllers] objectAtIndex:0]) subjectsTableView] reloadData];
NSLog(@"6");
[APP_DELEGATE.firstNavigationController dismissModalViewControllerAnimated:YES];
NSLog(@"7");
}

This code all executes correctly, down to the printing of the 7. It is after this point that the app explodes, with the stack trace posted above. What, logically, should happen after the ModalViewController is dismissed? (So I know where I should look next.)

I can't seem to determine what changes in my code spurred the sudden error, but any help is appreciated. :)

cmaier
Apr 9, 2008, 10:58 AM
I'm more interested in the tableviewcell code you changed.

Remember that if you mess up memory in one piece of code, you can get a crash in a completely unrelated bit of code. I'm assuming that when you changed the tableviewcell code you ended up dealloc'ing something that is later used, or you used something that's never been alloc'd.

Littleodie914
Apr 9, 2008, 12:06 PM
Wow, finally figured it out. I went through an older backup I had made, and compared the code line by line for changes. Turns out the erroneous stuff was in my App Delegate, in the following code:

//self.smartGroups = [[NSMutableArray alloc] init]; Old Code

// Begin New Code
NSMutableArray *newGroups = [NSMutableArray new];
IPM_ModelGroup *newGroup = [[IPM_ModelGroup alloc] initWithTitle:@"Spiffy Smart Group" subjects:[NSArray new] dayRange:7];
IPM_ModelGroup *newGroup2 = [[IPM_ModelGroup alloc] initWithTitle:@"New Group" subjects:[NSArray new] dayRange:14];

[newGroups addObject:newGroup];
[newGroups addObject:newGroup2];

self.smartGroups = newGroups;
// End New Code

Notice the commented out line of "Old Code." For some reason the tableview was unable to get the smart groups from the app delegate. Why would an object that had obviously been allocated an initialized cause an issue? (As the new code works fine.) :confused:

Sbrocket
Apr 9, 2008, 12:36 PM
I guess you found the new -[UITableView dequeueReusableCellWithIdentifier:] method that replaced availableCell: on the tableView:cellForRowAtIndexPath: delegate method, then. My UITableView that I've been piecing together really started acting weird this time around with Beta 3 of the SDK. Selections don't seem to work if you don't use -[UITableView dequeueReusableCellWithIdentifier:] to recycle cells in tableView:cellForRowAtIndexPath:, and selecting something then scrolling ends up with some weird behavior too. Not to mention it'll select multiple cells. So confusing...I love API changes so much. :mad:

kainjow
Apr 9, 2008, 12:49 PM
Littleodie914, I'd suggest not using new. It's kind of old school. Use alloc/init instead. Also, new returns an object with a retain count of 1 that is not autoreleased, so that code above is leaking memory. Instead of [NSMutableArray new] use [NSMutableArray array] which returns an autoreleased object.

cmaier
Apr 9, 2008, 01:56 PM
I guess you found the new -[UITableView dequeueReusableCellWithIdentifier:] method that replaced availableCell: on the tableView:cellForRowAtIndexPath: delegate method, then. My UITableView that I've been piecing together really started acting weird this time around with Beta 3 of the SDK. Selections don't seem to work if you don't use -[UITableView dequeueReusableCellWithIdentifier:] to recycle cells in tableView:cellForRowAtIndexPath:, and selecting something then scrolling ends up with some weird behavior too. Not to mention it'll select multiple cells. So confusing...I love API changes so much. :mad:

Where (if anywhere) is that thing documented? Can't seem to find it in the docs xcode is using.

Sbrocket
Apr 9, 2008, 02:32 PM
Where (if anywhere) is that thing documented? Can't seem to find it in the docs xcode is using.

The docs aren't updated, but if you check the header files its there and its shown in the API Beta 2 to Beta 3 changes.

Littleodie914
Apr 9, 2008, 09:45 PM
The docs aren't updated, but if you check the header files its there and its shown in the API Beta 2 to Beta 3 changes.Does anyone know why the documentation isn't being updated? After all, that's where Xcode gets its auto-completion "dictionary," and it's pretty frustrating to have it tell you "Oh sure, I know what you mean!" and insert the rest of a method, only to find out it's deprecated and crashes your app. :mad:

Sbrocket
Apr 10, 2008, 01:10 AM
Does anyone know why the documentation isn't being updated? After all, that's where Xcode gets its auto-completion "dictionary," and it's pretty frustrating to have it tell you "Oh sure, I know what you mean!" and insert the rest of a method, only to find out it's deprecated and crashes your app. :mad:

Its been updated now. I seem to remember clicking update for a few doc sets earlier so it much just take them a day or so to get the doc updates out.

Littleodie914
Apr 12, 2008, 08:56 AM
Littleodie914, I'd suggest not using new. It's kind of old school. Use alloc/init instead. Also, new returns an object with a retain count of 1 that is not autoreleased, so that code above is leaking memory. Instead of [NSMutableArray new] use [NSMutableArray array] which returns an autoreleased object.Ah, thanks. I knew there was a small difference between the two, but I always thought "new" was just a convenience method.

Also, I ran into this same problem again, and it turns out a few of my properties had been declared with the nonatomic attribute, which was causing some reference/thread issues as well. :o

Littleodie914
Apr 17, 2008, 08:10 AM
Back again guys, running into the same issue. Now it's when I try to delete a row from my tableview. Here's the stacktrace:

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000fffffffc
Crashed Thread: 0

Thread 0 Crashed:
0 UIKit 0x30c95f1d -[UITableViewRowData rectForRow:inSection:] + 188
1 UIKit 0x30c954c8 -[UITableViewRowData rectForGlobalRow:] + 147
2 UIKit 0x30b6d9f2 -[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:] + 11183
3 UIKit 0x30b622ba -[UITableView(_UITableViewPrivate) _endCellAnimations] + 644
4 iProcrastinate Mobile 0x000044ac -[IPM_SubjectsViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 768 (IPM_SubjectsViewController.m:148)
5 UIKit 0x30b697ed -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 95
6 UIKit 0x30bb93d8 -[UIRemoveControl _doRemove:] + 199
7 UIKit 0x30b26e30 -[UIApplication sendAction:to:from:forEvent:] + 116

And here's the line of code that it's breaking at:

[subjectsTableView deleteRowsAtIndexPaths:pathArray withRowAnimation:UITableViewRowAnimationFade];

I'm getting confused. I have no idea how to debug something like this! Any tips would be greatly appreciated. :)

Littleodie914
Apr 17, 2008, 10:43 AM
Hmm, I just realized that after deleting a row, then adding new rows, I start seeing weird GUI inconsistencies as well.:confused:

Littleodie914
Apr 23, 2008, 10:17 PM
Hmm... It seems like this might be an Apple bug? I built the *most basic* UITableView I could, and any reordering/deleting caused this flaw.

When I switch to a "Plain" table view, however (as opposed to a "Group" table view), there're no issues. :confused:

Edit: This issue remains unfixed in the new Beta 4 of the SDK, I've filed a bug report with Apple. If I hear anything back, I'll post it here.

Edit 2: Got an email back from Apple. It's a documented bug, and they're working on a fix. :)

blankmind
Jun 23, 2008, 02:55 PM
Hello,

I am using the Beta 7 and have come across the problem you have described (tableView deleteRowsAtIndexPaths:withAnimation) when trying to delete table rows. It happens, for me, just with the top row (pretty much the same stack trace) - all other rows delete fine. Does this now work for you or is it still causing problems?

Any help with this would be greatly appreciated!

sujithkrishnan
Jun 25, 2008, 04:05 AM
Hmm, I just realized that after deleting a row, then adding new rows, I start seeing weird GUI inconsistencies as well.:confused:

Hi.

I just want to know what image u used in ur view (screenshot u pasted) so as to get the iPhone native app look n feel??
Is that gradient is available???
I am searchiung for this background ...
Please help...

Littleodie914
Jul 3, 2008, 07:41 AM
Hi.

I just want to know what image u used in ur view (screenshot u pasted) so as to get the iPhone native app look n feel??
Is that gradient is available???
I am searchiung for this background ...
Please help...Hi. :)

If you're talking about the blue striped background, it's added automatically behind a grouped UITableView. I don't know if it's accessible outside of that.

rockman
Jan 1, 2009, 10:06 AM
Has anyone found the solution to this issue? I have the same problem,
multiple sections in a tableview and when numbofsections = 1, all is grand, but when > 1, crashed on delete.

Basically I have rows broken up into "months of the year", and I have tried returning static int, as well as dynamic int based on the actual months that are in the dataSource.


thanks in advance.
Rockman