iphonememory-managementfullcontact

Data Formatters temporarily unavailable, will re-try after a 'continue'


Here is the error message I get:

ContactsWithPN - start loop
Program received signal:  “0”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Unknown error loading shared library "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

Here is the code that causes this problem:

+(NSArray *) contactsWithPhoneNumbers{
    NSArray *contacts = [ABContactsHelper contacts];
    NSMutableArray *rv = [[NSMutableArray alloc] init];
    NSLog(@"ContactsWithPN - start loop");
    for (int i = 0; i< [contacts count] ; i++) {
        ABContact * c = (ABContact*)[contacts objectAtIndex:i];
        ABContact * fullContact = [ABContact  contactWithRecordID:[c recordID]];

        if ([[fullContact phoneArray] count] > 0) {
            [rv addObject:fullContact];
        }
    }
    NSLog(@"ContactsWithPN - end loop");
    NSArray *ret = [[NSArray alloc] initWithArray:rv];
    return ret;
}

In the View Controller that calls the said class method, I added the following code to see if memory warnings were being sent. They are not!

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    NSLog(@"InviteFriends - memory warning received");
}

Observations: + Found that error occurs at different points in time - sometimes at index 253, other times at 246.. + Only happens on the IPhone - not the simulator (on the simulator, there are < 5 contacts)s


Solution

  • The fact that you haven't received the memory warning doesn't mean that it wasn't sent: Memory warnings are delivered to the main run loop; they will not be delivered while your function is still running.

    Instead, consider looking at the phone console (Xcode->Organizer->Your phone->Console, or the equivalent in iPCU). If it says something like "memory level is critical" and mentions killing your app, then you've run out of memory. Additionally, when you run out of memory, the crash reporter writes a "low memory" crash log with "jettisoned" beside the processes that were killed; you should see these in the Organizer. (Since iOS 4's "multitasking", jettisoning also happens to background tasks.)

    If it's due solely to the large pile of autoreleased objects, you can mitigate it to some extent with explicit autorelease pools:

    for (int i = 0; i< [contacts count] ; i++) {
        NSAutoreleasePool * pool = [NSAutoreleasePool new];
    
        ...
    
        [pool drain]; pool = nil;
    }
    

    Your code also leaks ret and rv.