Crash With WebView in iPhone - iphone

I get following crash when I open a URL consecutively for 3 to 4 times in my app inside a webView.
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: EXC_ARM_DA_ALIGN at 0x0062006f
Crashed Thread: 0
Thread 0 Crashed:
0 libSystem.B.dylib 0x0000576c OSAtomicCompareAndSwap32 + 0
1 libobjc.A.dylib 0x000066ce changeInfo(class_t*, unsigned int, unsigned int) + 22
2 libobjc.A.dylib 0x00008412 realizeClass(class_t*) + 38
3 libobjc.A.dylib 0x0000862c prepareForMethodLookup + 44
4 libobjc.A.dylib 0x0000538a lookUpMethod + 34
5 libobjc.A.dylib 0x00002b82 _class_lookupMethodAndLoadCache + 6
6 libobjc.A.dylib 0x000028b8 objc_msgSend_uncached + 20
7 UIKit 0x001d68c2 -[UIWebView webView:didFinishLoadForFrame:] + 214
8 UIKit 0x001d5e0c -[UIWebViewWebViewDelegate webView:didFinishLoadForFrame:] + 16
9 CoreFoundation 0x0009f06c __invoking___ + 60
10 CoreFoundation 0x00032706 -[NSInvocation invoke] + 102
11 WebCore 0x00044d42 SendMessage(NSInvocation*) + 10
12 WebCore 0x0005846e HandleDelegateSource(void*) + 62
13 CoreFoundation 0x00071a86 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 6
14 CoreFoundation 0x00073768 __CFRunLoopDoSources0 + 376
15 CoreFoundation 0x00074504 __CFRunLoopRun + 224
16 CoreFoundation 0x0001d8e4 CFRunLoopRunSpecific + 224
17 CoreFoundation 0x0001d7ec CFRunLoopRunInMode + 52
18 GraphicsServices 0x000036e8 GSEventRunModal + 108
19 GraphicsServices 0x00003794 GSEventRun + 56
20 UIKit 0x000062a0 -[UIApplication _run] + 396
21 UIKit 0x00004e10 UIApplicationMain + 664
What could be wrong?
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(#"Button Clicked!");
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
orkutURLString = #"";
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:TRUE];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSURL *currentURL = orkutWebView.request.mainDocumentURL;
NSLog(#"Relative URL: %#",[currentURL relativePath]);
NSArray *urllistItems = [[currentURL relativePath] componentsSeparatedByString:#"/"];
if([urllistItems count]>1)
{
orkutURLString = [urllistItems objectAtIndex:1];
orkutURLString = [orkutURLString lowercaseString];
if([orkutURLString isEqualToString:#"share"])
{
orkutWebView = nil;
[orkutWebView removeFromSuperview];
[orkutView removeFromSuperview];
NSString *message1 = NSLocalizedStringFromTableInBundle( #"Your status update was sent", #"Localizable", [NewfoxRadioAppDelegate GetLocalizebundle], #"");
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:#"Newfox Radio" message:message1 delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[alertView show];
[alertView release];
}
}
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:FALSE];
}

Got the solution. Got an NSZombie wherein I was releasing the object and then trying to access it. Got the desired result after I made use of Instruments to find out the NSZombie.

Related

objective c - getting null values

I have been stuck on this for some time now but whats happening is that when the request comes back from mysql there is a null value but how do i check that a null value has hit my condition so that i dont store this value in the array. The code is below
The error i keep getting is -[NSNull isEqualToString:]: unrecognized and im trying to bind the array inside a tableview
- (void)viewDidLoad {
JobAddSiteAppDelegate *ja = (JobAddSiteAppDelegate *)[[UIApplication sharedApplication] delegate];
tempArray = [[NSMutableArray alloc] init];
NSString *strURL = [NSString stringWithFormat:#"http://www.bestitjobs.co.uk/appresults3.php", ""];
NSData *nsData = [NSData dataWithContentsOfURL:[NSURL URLWithString: strURL]];
//NSLog(#"JSON: %#", nsData);
//NSString *strResult = [[[NSString alloc] initWithData:nsData encoding:NSUTF8StringEncoding] autorelease];
//NSLog(#"Result: %#",strResult);
//NSError *e = nil;
JSONDecoder* decoder = [[JSONDecoder alloc] init];
NSDictionary* listDictionary = [nsData objectFromJSONData];
NSArray* people =[listDictionary objectForKey:#"jobs"];
for (NSDictionary *person in people) {
NSLog(#"people %#",people);
if([person objectForKey:#"position"] != [NSNull class])
{
NSString *position = [person objectForKey:#"position"];
NSLog(#"position %#",position);
[tempArray addObject: position];
}
}
self.listData = tempArray;
[tempArray release];
[listData release];
[super viewDidLoad];
}
Error
2012-12-06 12:22:11.314 JobAddSite[7718:207] position Senior Network and Systems Consultant
2012-12-06 12:22:11.316 JobAddSite[7718:207] position SAP Business One / SAP B1 Consultant London
2012-12-06 12:22:11.317 JobAddSite[7718:207] position Business Development Manager - Market Leading IT Company
2012-12-06 12:22:11.318 JobAddSite[7718:207] -[NSNull isEqualToString:]: unrecognized selector sent to instance 0xe565e8
2012-12-06 12:22:11.321 JobAddSite[7718:207] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0xe565e8'
* Call stack at first throw:
(
0 CoreFoundation 0x00de95a9 exceptionPreprocess + 185
1 libobjc.A.dylib 0x00f3d313 objc_exception_throw + 44
2 CoreFoundation 0x00deb0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00d5a966 __forwarding + 966
4 CoreFoundation 0x00d5a522 _CF_forwarding_prep_0 + 50
5 JobAddSite 0x000024cd -[ResultViewController viewDidLoad] + 604
6 UIKit 0x00389089 -[UIViewController view] + 179
7 UIKit 0x0038aa3d -[UIViewController viewControllerForRotation] + 63
8 UIKit 0x00386988 -[UIViewController _visibleView] + 90
9 UIKit 0x0062893c -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] + 354
10 UIKit 0x0030081e -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 954
11 UIKit 0x00588619 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 1381
12 UIKit 0x0038d65d -[UIViewController presentModalViewController:withTransition:] + 3478
13 JobAddSite 0x0000213f -[JobAddSiteViewController search] + 270
14 UIKit 0x002d94fd -[UIApplication sendAction:to:from:forEvent:] + 119
15 UIKit 0x00369799 -[UIControl sendAction:to:forEvent:] + 67
16 UIKit 0x0036bc2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
17 UIKit 0x0036a7d8 -[UIControl touchesEnded:withEvent:] + 458
18 UIKit 0x002fdded -[UIWindow _sendTouchesForEvent:] + 567
19 UIKit 0x002dec37 -[UIApplication sendEvent:] + 447
20 UIKit 0x002e3f2e _UIApplicationHandleEvent + 7576
21 GraphicsServices 0x01741992 PurpleEventCallback + 1550
22 CoreFoundation 0x00dca944 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52
23 CoreFoundation 0x00d2acf7 __CFRunLoopDoSource1 + 215
24 CoreFoundation 0x00d27f83 __CFRunLoopRun + 979
25 CoreFoundation 0x00d27840 CFRunLoopRunSpecific + 208
26 CoreFoundation 0x00d27761 CFRunLoopRunInMode + 97
27 GraphicsServices 0x017401c4 GSEventRunModal + 217
28 GraphicsServices 0x01740289 GSEventRun + 115
29 UIKit 0x002e7c93 UIApplicationMain + 1160
30 JobAddSite 0x00001dec main + 102
31 JobAddSite 0x00001d7d start + 53
)
terminate called after throwing an instance of 'NSException'
Just try this one:
if ([person objectForKey:#"position"]) {..}
This one is the same but maybe more readable:
if ([person objectForKey:#"position"] != nil) {..}
Hi Use the following code.
It is working Well.
Download Supporting Files
NSMutableArray *empArray = [[NSMutableArray alloc] init];
SBJSON *parser = [[SBJSON alloc] init];
NSURLRequest *request1 = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:#"http://www.bestitjobs.co.uk/appresults3.php"]]];
NSLog(#"GGGG:%#",request1);
NSData *response1 = [NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response1 encoding:NSUTF8StringEncoding];
NSDictionary *statuses = [parser objectWithString:json_string error:nil];
NSLog(#"List Dictionary:%#",statuses);
NSArray* people =[statuses objectForKey:#"jobs"];
for(NSDictionary *test in people)
{
[empArray addObject:[test valueForKey:#"position"]];
}
NSLog(#"EMP ARRAY CATEGORY:%#",empArray);
Note: Before you Use SBJSon supporting files and import JSON.h
And check your console.
Check condition like this and add value to Array
for (NSDictionary *person in people) {
NSLog(#"people %#",people);
NSString *position = [person objectForKey:#"position"];
if(position) {
[tempArray addObject: position];
}
}

NSDictionary parsing Exception in iphone

I am using this code and it is giving exception
NSMutableArray *streams = (NSMutableArray *)[feed valueForKey:#"comments"];
NSMutableArray *streams1 = (NSMutableArray *)[streams valueForKey:#"data"];
//NSMutableArray *streams2 = (NSMutableArray *)[streams1 valueForKey:#"message"];
// loop over all the stream objects and print their titles
int index;
NSMutableDictionary *stream;
for (index = 0; index < [feed count];index++) {
stream = (NSMutableDictionary *)[streams1 objectAtIndex:index];
NSLog(#"Name of sender is: %#", [stream valueForKey:#"message"]);
}
FaceBookTable *detailViewController = [[FaceBookTable alloc] initWithNibName:#"FaceBookTable" bundle:nil];
// ...
// Pass the selected object to the new view controller.
detailViewController.fbGraph = fbGraph;
detailViewController.dummyArray = [ feed valueForKey:#"message"];
detailViewController.dict = stream;
}
Exception is
-[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x5dae960
2011-06-15 16:14:07.835 MultiSocial[8042:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x5dae960'
while my other code is working fine
NSMutableArray *streams = (NSMutableArray *)[feed valueForKey:#"from"];
lueForKey:#"message"];
// loop over all the stream objects and print their titles
int index;
NSMutableDictionary *stream;
for (index = 0; index < [feed count];index++) {
stream = (NSMutableDictionary *)[streams objectAtIndex:index];
NSLog(#"Name of sender is: %#", [stream valueForKey:#"message"]);
}
Please help
here is crash log
2011-06-15 17:05:42.148 MultiSocial[8583:207] -[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x5d05f50
2011-06-15 17:05:42.156 MultiSocial[8583:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI isEqualToString:]: unrecognized selector sent to instance 0x5d05f50'
*** Call stack at first throw:
(
0 CoreFoundation 0x013cabe9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x0151f5c2 objc_exception_throw + 47
2 CoreFoundation 0x013cc6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x0133c366 ___forwarding___ + 966
4 CoreFoundation 0x0133bf22 _CF_forwarding_prep_0 + 50
5 UIKit 0x00649405 -[UITableViewLabel setText:] + 84
6 MultiSocial 0x00046147 -[FaceBookTable tableView:cellForRowAtIndexPath:] + 467
7 UIKit 0x0045f7fa -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634
8 UIKit 0x0045577f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
9 UIKit 0x0046a450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
10 UIKit 0x00462538 -[UITableView layoutSubviews] + 242
11 QuartzCore 0x01e98451 -[CALayer layoutSublayers] + 181
12 QuartzCore 0x01e9817c CALayerLayoutIfNeeded + 220
13 QuartzCore 0x01e9137c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
14 QuartzCore 0x01e910d0 _ZN2CA11Transaction6commitEv + 292
15 QuartzCore 0x01ec17d5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
16 CoreFoundation 0x013abfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
17 CoreFoundation 0x013410e7 __CFRunLoopDoObservers + 295
18 CoreFoundation 0x01309bd7 __CFRunLoopRun + 1575
19 CoreFoundation 0x01309240 CFRunLoopRunSpecific + 208
20 CoreFoundation 0x01309161 CFRunLoopRunInMode + 97
21 GraphicsServices 0x0190f268 GSEventRunModal + 217
22 GraphicsServices 0x0190f32d GSEventRun + 115
23 UIKit 0x003fa42e UIApplicationMain + 1160
24 MultiSocial 0x00002740 main + 102
25 MultiSocial 0x000026d1 start + 53
)
Well as per the crash log -[__NSArrayI isEqualToString:] there is some mistake in your code. It is clearly visible in the crash report that isEqualToString method is for NSString object but in your code it is called on NSArray.
Just debug your app and you will find the solution.
UPDATE
//Make sure that feed return an array for the key comments
NSArray *streams = (NSArray *)[feed valueForKey:#"comments"];
NSArray *streams1 = (NSArray *)[streams valueForKey:#"data"];
NSLog(#"comments : %#",streams);
//When you are running loop only last index value will be copied into your dictionary named stream so remove the loop.
FaceBookTable *detailViewController = [[FaceBookTable alloc] initWithNibName:#"FaceBookTable" bundle:nil];
// ...
// Pass the selected object to the new view controller.
detailViewController.fbGraph = fbGraph;
detailViewController.dummyArray = [ feed valueForKey:#"message"];
detailViewController.dict = streams;
}
//Your tableView cellForRowAtIndexPath method should look like this
//First get the dictionary
if(dict){
NSDictionary *stream = (NSDictionary *)[dict objectAtIndex:indexPath.row];
if(stream){
NSDictionary * messages = (NSDictionary *[stream valueForKey:#"Message"];
NSString *comment = [messages valueForKey:#"comment"];
cell.textLabel.text = comment;
}
}
u have been assigning the NSString object to NSArray.so do debug with breakpoints
NSMutableArray *arr = [[[feed valueForKey:#"comments"]valueForKey:#"data" ]valueForKey:#"id"];
for (NSString* cid in [arr objectAtIndex:0]) {
NSLog(#"cid is : %# \n\n",cid);
}

App crashing when adding to Core Data

Does anyone can tell me what is the source of this crash, because I have no idea what could be wrong. Here the crash log:
Incident Identifier: 517593EA-7CBC-4790-A924-966938AAA01B
CrashReporter Key: 179f2e12142cea96d45f2f6475c7f89a7a702d90
Hardware Model: iPhone1,2
Process: AppName [3579]
Path: /var/mobile/Applications/9FBBBD37-2A31-4240-A8AC-64E5BD0B00C0/AppName.app/AppName
Identifier: AppName
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2011-04-04 15:51:32.466 +0200
OS Version: iPhone OS 4.2.1 (8C148)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000004
Crashed Thread: 9
Thread 0:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 libSystem.B.dylib 0x35d5d894 mach_msg + 60
2 CoreFoundation 0x37521f7c __CFRunLoopServiceMachPort + 88
3 CoreFoundation 0x37521780 __CFRunLoopRun + 400
4 CoreFoundation 0x37521504 CFRunLoopRunSpecific + 220
5 CoreFoundation 0x37521412 CFRunLoopRunInMode + 54
6 GraphicsServices 0x33e76d1c GSEventRunModal + 188
7 UIKit 0x3591d574 -[UIApplication _run] + 580
8 UIKit 0x3591a550 UIApplicationMain + 964
9 AppName 0x00002c9a main (main.m:13)
10 AppName 0x00002c64 start + 32
Thread 1:
0 libSystem.B.dylib 0x35d8f974 kevent + 24
1 libSystem.B.dylib 0x35e5e2fc _dispatch_mgr_invoke + 88
2 libSystem.B.dylib 0x35e5dd68 _dispatch_queue_invoke + 96
3 libSystem.B.dylib 0x35e5d788 _dispatch_worker_thread2 + 120
4 libSystem.B.dylib 0x35de6970 _pthread_wqthread + 392
5 libSystem.B.dylib 0x35ddd2fc start_wqthread + 0
Thread 2:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 libSystem.B.dylib 0x35d5d894 mach_msg + 60
2 CoreFoundation 0x37521f7c __CFRunLoopServiceMachPort + 88
3 CoreFoundation 0x37521780 __CFRunLoopRun + 400
4 CoreFoundation 0x37521504 CFRunLoopRunSpecific + 220
5 CoreFoundation 0x37521412 CFRunLoopRunInMode + 54
6 WebCore 0x3318bd14 RunWebThread(void*) + 524
7 libSystem.B.dylib 0x35de5b44 _pthread_start + 364
8 libSystem.B.dylib 0x35dd77a4 thread_start + 0
Thread 3:
0 libSystem.B.dylib 0x35de454c __semwait_signal + 24
1 libSystem.B.dylib 0x35d5d198 nanosleep + 120
2 Foundation 0x351e066a +[NSThread sleepForTimeInterval:] + 98
3 AppName 0x00005b40 -[Syncer requestPump] (Syncer.m:116)
4 Foundation 0x3515cb8a -[NSThread main] + 42
5 Foundation 0x35155b90 __NSThread__main__ + 908
6 libSystem.B.dylib 0x35de5b44 _pthread_start + 364
7 libSystem.B.dylib 0x35dd77a4 thread_start + 0
Thread 4:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 libSystem.B.dylib 0x35d5d894 mach_msg + 60
2 CoreFoundation 0x37521f7c __CFRunLoopServiceMachPort + 88
3 CoreFoundation 0x37521780 __CFRunLoopRun + 400
4 CoreFoundation 0x37521504 CFRunLoopRunSpecific + 220
5 CoreFoundation 0x37521412 CFRunLoopRunInMode + 54
6 Foundation 0x3517ec4e +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 210
7 Foundation 0x3515cb8a -[NSThread main] + 42
8 Foundation 0x35155b90 __NSThread__main__ + 908
9 libSystem.B.dylib 0x35de5b44 _pthread_start + 364
10 libSystem.B.dylib 0x35dd77a4 thread_start + 0
Thread 5:
0 libSystem.B.dylib 0x35d848d8 select$DARWIN_EXTSN + 20
1 CoreFoundation 0x3755aa34 __CFSocketManager + 356
2 libSystem.B.dylib 0x35de5b44 _pthread_start + 364
3 libSystem.B.dylib 0x35dd77a4 thread_start + 0
Thread 6:
0 libSystem.B.dylib 0x35de72fc __workq_kernreturn + 8
1 libSystem.B.dylib 0x35de6b50 _pthread_wqthread + 872
2 libSystem.B.dylib 0x35ddd2fc start_wqthread + 0
Thread 7:
0 libSystem.B.dylib 0x35de72fc __workq_kernreturn + 8
1 libSystem.B.dylib 0x35de6b50 _pthread_wqthread + 872
2 libSystem.B.dylib 0x35ddd2fc start_wqthread + 0
Thread 8:
0 libSystem.B.dylib 0x35de72fc __workq_kernreturn + 8
1 libSystem.B.dylib 0x35de6b50 _pthread_wqthread + 872
2 libSystem.B.dylib 0x35ddd2fc start_wqthread + 0
Thread 9 Crashed:
0 CoreFoundation 0x374fec60 __CFBasicHashAddValue + 140
1 CoreFoundation 0x374ff8fc CFBasicHashAddValue + 276
2 CoreFoundation 0x3750410a CFSetAddValue + 90
3 CoreFoundation 0x3752be2a -[__NSCFSet addObject:] + 34
4 CoreData 0x34998002 -[NSManagedObjectContext(_NSInternalAdditions) _insertObjectWithGlobalID:globalID:] + 134
5 CoreData 0x34997ec6 -[NSManagedObjectContext insertObject:] + 58
6 CoreData 0x34979cbc -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 248
7 AppName 0x00066512 -[SNServerChanges newItemWithJSONStringFor:withList:] (SNServerChanges.m:655)
8 AppName 0x0006847a -[SNServerChanges requestDidFinishThread:] (SNServerChanges.m:282)
9 AppName 0x00065b28 -[SNServerChanges makeChanges:] (SNServerChanges.m:41)
10 Foundation 0x3515cb8a -[NSThread main] + 42
11 Foundation 0x35155b90 __NSThread__main__ + 908
12 libSystem.B.dylib 0x35de5b44 _pthread_start + 364
13 libSystem.B.dylib 0x35dd77a4 thread_start + 0
Thread 9 crashed with ARM Thread State:
r0: 0x0405ceb0 r1: 0x00000000 r2: 0x00000004 r3: 0x00000001
r4: 0x0405ceb0 r5: 0x002e1c20 r6: 0x00000004 r7: 0x04468884
r8: 0x00000001 r9: 0x044688ac r10: 0x0405ceb0 r11: 0x002bf670
ip: 0x00000000 sp: 0x04468870 lr: 0x34982145 pc: 0x374fec60
cpsr: 0x20000010
One thing I know is the fact that there is something wrong when I try to add new object to Core Data.
This is how I set up Core Data:
- (id) init {
if (self = [super init]) {
NSString* path = [[NSBundle mainBundle] pathForResource:#"Main210" ofType:#"mom"];
NSURL* url = [NSURL fileURLWithPath:path];
url = [[NSURL alloc] initFileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: #"data.bin"]];
NSError *error = nil;
sqlite3_enable_shared_cache(0); // from apple Bug ID# 8055992
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error])
{
NSLog(#"Error: %# \n\n userInfo: %# \n\n ", error, [error userInfo]);
NSError *underlyingError = [[error userInfo] objectForKey:NSUnderlyingErrorKey];
if (underlyingError) {
NSLog(#"Underlying error: %# \n\n userInfo: %# \n\n", underlyingError, [underlyingError userInfo]);
}
NSArray *detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
for (NSError *detailError in detailedErrors) {
NSLog(#"Detailed error: %# \n\n userInfo: %# \n\n", detailError, [detailError userInfo]);
}
abort();
}
if (persistentStoreCoordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: persistentStoreCoordinator];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[managedObjectContext setUndoManager:undoManager];
[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
}
}
return self;
}
And the function which causes crash:
-(void) newItemWithJSONStringFor:(NSArray*) itemsArray withList:(Lista*) lista {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSNumber *databaseID;
if(LOG==1)NSLog(#"Lista : %#, itemsArrayCount: %d",[lista name], [itemsArray count]);
for (int i=0; i<itemsArray.count; i++) {
[NSThread sleepForTimeInterval:EACHITEMWAITTIME];
NSDictionary* jsonItem = [itemsArray objectAtIndex:i];
databaseID = [jsonItem valueForKey:#"Id"];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:#"Item" inManagedObjectContext:[CoreDataHandler syncContext]];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"databaseID == %qi", [databaseID longLongValue]];
[request setPredicate:predicate];
NSError* error;
NSMutableArray *mutableFetchResults = [[[CoreDataHandler syncContext] executeFetchRequest:request error:&error] mutableCopy];
[request release];
BOOL flag = YES; //will item be created?
if (! (mutableFetchResults && [mutableFetchResults count] == 0) ) {
flag = NO;
}
Item* item = [mutableFetchResults lastObject];
if (!item) {
NSEntityDescription *entity = [NSEntityDescription entityForName:#"Item" inManagedObjectContext:[CoreDataHandler syncContext]];
item = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:[CoreDataHandler syncContext]];
item.databaseID = databaseID;
item.databaseIDSet = [NSNumber numberWithBool:YES];
item.lista = lista;
[mutableFetchResults addObject:item];
}
else {
if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - Modyfing");
}
if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - FillingItem");
// if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - Making new");
//Nazwa
if ([jsonItem valueForKey:#"N"] != [NSNull null])
item.name = [jsonItem valueForKey:#"N"];
//Opis
if ([jsonItem valueForKey:#"D"] != [NSNull null])
item.desc = [jsonItem valueForKey:#"D"];
//Ilosc
if ([jsonItem valueForKey:#"Q"] != [NSNull null])
item.quantity = [jsonItem valueForKey:#"Q"];
//Jednostka
if ([jsonItem valueForKey:#"U"] != [NSNull null])
item.unit = [jsonItem valueForKey:#"U"];
//Checked
if ([jsonItem valueForKey:#"C"] != [NSNull null]){
NSLog(#"SC New : %#, %d",[item fullName], [[item checked] boolValue]);
if(![item.checkedChanged boolValue]){
item.checked = [NSNumber numberWithBool:[[jsonItem valueForKey:#"C"] boolValue]];
}
else
[SyncManager doNextSync];
}
//Pozycja
if ([jsonItem valueForKey:#"O"] != [NSNull null])
item.position = [NSNumber numberWithInt: [[jsonItem valueForKey:#"O"] intValue]];
//Reklama
if([jsonItem valueForKey:#"Adv"]!= nil && [jsonItem valueForKey:#"Adv"]!=[NSNull null]) {
NSDictionary* temp = [jsonItem valueForKey:#"Adv"];
NSString* tempString = [NSString stringWithFormat:#"%#",[temp valueForKey:#"T"]];
item.advert = tempString;
}
//Cena
if ( [jsonItem valueForKey:#"P"] != nil && [jsonItem valueForKey:#"P"]!=[NSNull null])
{
NSObject* obj = [jsonItem valueForKey:#"P"];
item.price=[NSNumber numberWithDouble:[[jsonItem valueForKey:#"P"] doubleValue]];
}
if ([jsonItem valueForKey:#"Pe"] != [NSNull null])
item.priceEstimated = [NSNumber numberWithBool:[[jsonItem valueForKey:#"Pe"] boolValue]];
if ([jsonItem valueForKey:#"Ci"] != [NSNull null])
item.categoryID = [NSNumber numberWithInt: [[jsonItem valueForKey:#"Ci"] intValue]];
if (flag) {
if ( [item.checked boolValue] )
lista.checked = [NSNumber numberWithInt:[lista.checked intValue]+1];
lista.count = [NSNumber numberWithInt:[lista.count intValue]+1];
}
// if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - Fetching");
if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - AddingToItemCache");
if(LOG==1)NSLog(#"\tItem : %#", [item name]);
//[ItemCache processItem: item];
// [(SNServerChanges*)[SNServerChanges sharedInstance] performSelectorOnMainThread:#selector(saveCoreData) withObject:nil waitUntilDone:YES];
if(LOG==1)NSLog(#"SNServerChanges - newItemWithJSONString - ItemAdded");
}
[pool drain];
}
The app is presumably crashing on this line:
item = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:[CoreDataHandler syncContext]];
You have item defined previously as of class Item but now you are assigning a generic NSManagedObject to it. That is probably the cause of the crash.
I can't see where you've gone wrong (unless there's no Item entity in your model - why not NSLog(#"%#",item);?). I've always used a different call to add a new object, instead of the explicit allocation of an NSManagedObject:
[NSEntityDescription insertNewObjectForEntityForName:#"Item"
inManagedObjectContext:managedObjectContext];
Not sure if it matters.

Leak with Mutable Array even when released

Instruments point to this line saying there is a leak here
- (void) loadFavoriteData {
TradePortMobileAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [delegate managedObjectContext];
NSManagedObjectModel *objectModel = [[context persistentStoreCoordinator] managedObjectModel];
Session *session = delegate.session;
NSDictionary *param = [NSDictionary dictionaryWithObjectsAndKeys: [session objectForKey:#"CTY_CODE"], pCOUNTRY, nil];
NSFetchRequest *fetchRequest = [objectModel fetchRequestFromTemplateWithName:#"fetchAllFavorites" substitutionVariables:param];
[fetchRequest setSortDescriptors: self.dataSorter];
NSError *error;
//THIS IS THE LINE INSTRUMENT SAYS THERE IS A LEAK!!!!!
NSMutableArray *favorites = [[context executeFetchRequest:fetchRequest error:&error] mutableCopy];
if ([favorites count] > 0) {
[self.favoriteList removeAllObjects];
for (NSInteger i=0; i < [favorites count]; i++) {
FavoriteData *favorite = [favorites objectAtIndex: i];
if (i < vMaxRecordsInCoreData) {
[self.favoriteList addObject:[FavoriteInfo favoriteInfoWithClientId:favorite.clientId withName:favorite.name
withAddress:favorite.address
withPhone:favorite.phone
withEmail:favorite.email
withCountry:favorite.country
withLtpId:favorite.ltpId
withUpdateTimestamp:favorite.updateTimestamp
withNoOfDetails:favorite.noOfDetails]];
}
else {
[context deleteObject:favorite];
}
}
if (![context save:&error]) {
NSLog(#"deleting excess favorites failed.");
}
self.navigationItem.leftBarButtonItem.enabled = YES;
}
else {
[self.favoriteList removeAllObjects];
self.navigationItem.leftBarButtonItem.enabled = NO;
}
[favorites removeAllObjects];
[favorites release];
}
This is the stack
0 CoreFoundation _CFRuntimeCreateInstance
1 CoreFoundation __CFStringCreateImmutableFunnel3
2 CoreFoundation CFStringCreateWithCString
3 CoreData -[NSSQLCore _prepareResultsFromResultSet:usingFetchPlan:withMatchingRows:]
4 CoreData -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:]
5 CoreData -[NSSQLCore newRowsForFetchPlan:]
6 CoreData -[NSSQLCore objectsForFetchRequest:inContext:]
7 CoreData -[NSSQLCore executeRequest:withContext:error:]
8 CoreData -[NSPersistentStoreCoordinator executeRequest:withContext:error:]
9 CoreData -[NSManagedObjectContext executeFetchRequest:error:]
MY CODE HERE--->10 TradePortMobile -[FavoritesTableViewController loadFavoriteData] /Users/aldrich/Projects/iPhone/Classes/FavoritesTableViewController.m:281
11 TradePortMobile -[FavoritesTableViewController viewWillAppear:] /Users/aldrich/Projects/iPhone/Classes/FavoritesTableViewController.m:54
12 UIKit -[UINavigationController viewWillAppear:]
13 UIKit -[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
14 UIKit -[UITabBarController transitionFromViewController:toViewController:]
15 UIKit -[UITabBarController _setSelectedViewController:]
16 UIKit -[UITabBarController _tabBarItemClicked:]
17 UIKit -[UIApplication sendAction:to:from:forEvent:]
18 UIKit -[UITabBar _sendAction:withEvent:]
19 UIKit -[UIApplication sendAction:to:from:forEvent:]
20 UIKit -[UIControl sendAction:to:forEvent:]
21 UIKit -[UIControl(Internal) _sendActionsForEvents:withEvent:]
22 UIKit -[UIControl sendActionsForControlEvents:]
23 UIKit -[UIApplication sendAction:to:from:forEvent:]
24 UIKit -[UIControl sendAction:to:forEvent:]
25 UIKit -[UIControl(Internal) _sendActionsForEvents:withEvent:]
26 UIKit -[UIControl touchesEnded:withEvent:]
27 UIKit -[UIWindow _sendTouchesForEvent:]
28 UIKit -[UIApplication sendEvent:]
29 UIKit _UIApplicationHandleEvent
30 GraphicsServices PurpleEventCallback
31 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
32 CoreFoundation __CFRunLoopDoSource1
33 CoreFoundation __CFRunLoopRun
34 CoreFoundation CFRunLoopRunSpecific
35 CoreFoundation CFRunLoopRunInMode
36 GraphicsServices GSEventRunModal
37 GraphicsServices GSEventRun
38 UIKit UIApplicationMain
39 TradePortMobile main /Users/aldrich/Projects/iPhone/main.m:14
40 TradePortMobile start
May somebody give me a push to the right direction? or an answer to this leak i can not solve :)
The leak tool can only point to where the memory has been allocated, the leak is probably happening as you are passing some of the properties of each object from the array in the following code:
[self.favoriteList addObject:[FavoriteInfo favoriteInfoWithClientId:favorite.clientId withName:favorite.name
withAddress:favorite.address
withPhone:favorite.phone
withEmail:favorite.email
withCountry:favorite.country
withLtpId:favorite.ltpId
withUpdateTimestamp:favorite.updateTimestamp
withNoOfDetails:favorite.noOfDetails]];
you need to check what happens with the parameters of favoriteInfoWithClientId:favorite - if you retain any of these then you will have a leak...
hope this helps

AddressBook Crash, only with some contacts

My app crashes, it is a problem that arises from the AddressBook API, it only happens with some contacts.
Here is the log:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x00000102, 0x316ebd38
Crashed Thread: 0
Thread 0 Crashed:
0 CoreFoundation 0x00001cfe CFRetain + 90
1 AddressBook 0x00004b2c ABCMultiValueCopyValueAtIndex + 28
2 AddressBook 0x0001066a ABMultiValueCopyValueAtIndex + 2
3 Call Monitor 0x00003824 -[CallAppDelegate peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:] (AppDelegate.m:408)
4 AddressBookUI 0x00032cfc -[ABPeoplePickerNavigationController personViewController:shouldPerformDefaultActionForPerson:property:identifier:withMemberCell:] + 152
5 AddressBookUI 0x0003b8ce -[ABPersonViewControllerHelper personTableViewDataSource:selectedPropertyAtIndex:inPropertyGroup:withMemberCell:forEditing:] + 222
6 AddressBookUI 0x0004a17c -[ABPersonTableViewDataSource valueAtIndex:selectedForPropertyGroup:withMemberCell:forEditing:] + 40
7 AddressBookUI 0x00048c00 -[ABPersonTableViewDataSource tableView:didSelectRowAtIndexPath:] + 316
8 UIKit 0x00091f40 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 656
9 UIKit 0x0009db40 -[UITableView _userSelectRowAtIndexPath:] + 124
10 Foundation 0x00086c86 __NSFireDelayedPerform + 362
11 CoreFoundation 0x00071a54 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
12 CoreFoundation 0x00073ede __CFRunLoopDoTimer + 854
13 CoreFoundation 0x0007485e __CFRunLoopRun + 1082
14 CoreFoundation 0x0001d8e4 CFRunLoopRunSpecific + 224
15 CoreFoundation 0x0001d7ec CFRunLoopRunInMode + 52
16 GraphicsServices 0x000036e8 GSEventRunModal + 108
17 GraphicsServices 0x00003794 GSEventRun + 56
18 UIKit 0x000062a0 -[UIApplication _run] + 396
19 UIKit 0x00004e10 UIApplicationMain + 664
20 Call Monitor 0x000028e8 main (main.m:14)
21 Call Monitor 0x000028b8 start + 32
This is driving me crazy, as it only happens with an isolated number of contacts.
Any help would be greatly appreciated.
Here is the code that was requested, thank you very very much for your help:
(It is an extract from the method where I think the error happens)
The weird thing is that it only happens with certain contacts, and deleting the contact, then creating a new one solves the problem...
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
NSString* firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString* lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
NSNumber* record = [NSNumber numberWithInt:ABRecordGetRecordID(person)];
if(lastName!=nil){
name=[NSString stringWithFormat:#"%# %#",firstName,lastName];
}
else {
name=firstName;
}
ABMultiValueRef phone = ABRecordCopyValue(person, property);
NSString *value =(NSString *)ABMultiValueCopyValueAtIndex(phone, identifier);
NSString *label =(NSString *)ABMultiValueCopyLabelAtIndex(phone, identifier);
NSMutableArray *tempArray=[[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:#"MainArray"]];
NSDictionary *stringDictionary = [NSDictionary dictionaryWithObjectsAndKeys:name, kLabelKey, value, kNumberKey,label, kNumberLabelKey,record, kReferenceKey, nil];
[tempArray addObject:stringDictionary];
NSArray *mainArray = [NSArray arrayWithArray:tempArray];
[[NSUserDefaults standardUserDefaults] setObject:mainArray forKey:#"MainArray"];
To anyone experiencing a similar problem:
My error came from the fact that I was using:
ABMultiValueCopyValueAtIndex with an identifier instead of an index.
You have to call ABMultiValueGetIndexForIdentifier and then use that index on the ABMultiValueCopyValueAtIndex.
The bottom line is Identifier!=index.
Instead of using
ABMultiValueCopyValueAtIndex(multiValue, identifier);
Which Zebs pointed out above, use...
ABMultiValueCopyValueAtIndex(multiValue, ABMultiValueGetIndexForIdentifier(multiValue, identifier));
I would make sure you're really dealing with valid multi value record type.
if (ABMultiValueGetPropertyType(phone) != kABInvalidPropertyType) {
// Do work here.
}
Actually, it would probably be safer to make sure it's really a string.
if (ABMultiValueGetPropertyType(phone) == kABMultiStringPropertyType) {
// Do work here.
}
I don't know why this wouldn't be the case. Maybe you have corrupted contacts entries? Or maybe sometimes the phone number isn't a multi value type?