thread #7: tid = 0x2403, 0x351b9010 libsystem_kernel.dylibmach_msg_trap + 20
frame #0: 0x351b9010 libsystem_kernel.dylibmach_msg_trap + 20
frame #1: 0x351b920c libsystem_kernel.dylibmach_msg + 56
frame #2: 0x33672422 CoreFoundationCFRunLoopServiceMachPort + 126
frame #3: 0x3367115a CoreFoundation__CFRunLoopRun + 882
frame #4: 0x335f44dc CoreFoundationCFRunLoopRunSpecific + 300
frame #5: 0x335f43a4 CoreFoundationCFRunLoopRunInMode + 104
frame #6: 0x30e8cbc8 Foundation+[NSURLConnection(Loader) resourceLoadLoop:] + 308
frame #7: 0x30e8ca90 Foundation-[NSThread main] + 72
frame #8: 0x30f205a0 Foundation_NSThread__main + 1048
frame #9: 0x3709bc1c libsystem_c.dylib`_pthread_start + 320
I am not using ASINetworkQueue and using through an array of urls, and I have implemented the requestFinished: method, that gets called fine. I got received crash when request is not responded.
Could you please some one help me out ?
Sample Code snippet :
Class A (Wrapper class extends ASIHTTPRequest) :
ASIHTTPRequest *httpRequest;
- (id)initWithURL:(NSString *)anURL errorInfo:(NSError **)error {
if (self = [super init]) {
NSURL *httpURL = [NSURL URLWithString:anURL];
httpRequest = [self createASIRequest:httpURL];
didFinishSelector = #selector(requestFinished:);
didFailSelector = #selector(requestFailed:);
return self;
}
}
- (void)dealloc {
if (httpRequest) {
[httpRequest clearDelegatesAndCancel];
[httpRequest release];
httpRequest = nil;
}
[super dealloc];
}
- (ASIHTTPRequest *)createASIRequest:(NSURL *)url {
ASIHTTPRequest *request = [[ASIHTTPRequest requestWithURL:url] retain];
request.delegate = self;
return request;
}
Class B :
Request in loop:
Class A *d = [[Class A alloc] initWithURL:url errorInfo:&pError];
d.didFinishSelector = #selector(responseHandler:);
d.didFailSelector = #selector(responseHandler:);
The delegate methods are being called after view controller has been released. So, needs to clean all delegates before releasing the view controller.This works for me.
Related
The code below returns the following error when I log/request values from the History Core Data object:
-[CFNumber release]: message sent to deallocated instance 0x17ea2a90
I originally thought there was an issue elsewhere and have spent countless hours attempting to debug this to no luck. After further testing, I have pinpointed the crash to requesting certain values from the History Core Data object. Can anyone see any issues to why the object values are being deallocated?
[[DocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
if(!self.document) {
self.document = document;
}
__block NSString *identifier = [[NSUserDefaults standardUserDefaults] objectForKey:kUserDefaultsUserIdentifier];
[self.document.managedObjectContext performBlock:^{
// Create history object
History *history = [NSEntityDescription insertNewObjectForEntityForName:#"History"
inManagedObjectContext:self.document.managedObjectContext];
history.identifier = identifier;
history.followers = [NSNumber numberWithInteger:53];
history.following = [NSNumber numberWithInteger:53];
history.newFollowers = [NSNumber numberWithInteger:53];
history.unfollowers = [NSNumber numberWithInteger:53];
history.fans = [NSNumber numberWithInteger:53];
history.mutualFriends = [NSNumber numberWithInteger:53];
history.nonFollowers = [NSNumber numberWithInteger:53];
[self.document saveToURL:self.document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
// Fetch previous records
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:#"History"];
request.predicate
= [NSPredicate predicateWithFormat:#"identifier == %#", identifier];
NSError *error = nil;
NSArray *records = [self.document.managedObjectContext executeFetchRequest:request error:&error];
[records enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(#"%#", [(History *)obj newFollowers]); // Crash takes place here
}];
}];
}];
}];
More logs with an exception breakpoint enabled:
(lldb) bt
* thread #1: tid = 0x28b70, 0x3b5787fa libobjc.A.dylib`objc_release + 10, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x10)
frame #0: 0x3b5787fa libobjc.A.dylib`objc_release + 10
frame #1: 0x3b578022 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
frame #2: 0x311b4298 CoreFoundation`_CFAutoreleasePoolPop + 16
frame #3: 0x3127533e CoreFoundation`__NSArrayEnumerate + 614
frame #4: 0x31216012 CoreFoundation`-[NSArray enumerateObjectsWithOptions:usingBlock:] + 62
frame #5: 0x000eae26 Twitter Followers`__71-[MainViewController updateCurrentRecordAndTableHeaderForUpdateAction:]_block_invoke_2(.block_descriptor=0x15e58080, success='\x01') + 678 at MainViewController.m:671
frame #6: 0x3ba65bea libdispatch.dylib`_dispatch_barrier_sync_f_slow_invoke + 66
frame #7: 0x3ba600ee libdispatch.dylib`_dispatch_client_callout + 22
frame #8: 0x3ba629a8 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 268
frame #9: 0x3124b5b8 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
frame #10: 0x31249e84 CoreFoundation`__CFRunLoopRun + 1308
frame #11: 0x311b4540 CoreFoundation`CFRunLoopRunSpecific + 524
frame #12: 0x311b4322 CoreFoundation`CFRunLoopRunInMode + 106
frame #13: 0x35eeb2ea GraphicsServices`GSEventRunModal + 138
frame #14: 0x33a6b1e4 UIKit`UIApplicationMain + 1136
According to the Transitioning to ARC Release Notes:
To allow interoperation with manual retain-release code, ARC imposes a constraint on method naming:
You cannot give an accessor a name that begins with new. This in turn means that you can’t, for example, declare a property whose name begins with new unless you specify a different getter:
// Won't work:
#property NSString *newTitle;
// Works:
#property (getter=theNewTitle) NSString *newTitle;
Bottom line, methods that start with new are assumed to return an object that ARC is responsible for managing and releasing (but this isn't the case here). I'd suggest just changing your property so that it doesn't start with new to avoid any confusion.
[__NSArrayM relatedObjectDidChange]: unrecognized selector sent to instance
error Class: NSInvalidArgumentException
the crash report stackTrace:
0 CoreFoundation 0x33d153e7 <redacted> + 162
1 libobjc.A.dylib 0x3ba06963 objc_exception_throw + 30
2 CoreFoundation 0x33d18f31 <redacted> + 0
3 CoreFoundation 0x33d1764d <redacted> + 392
4 CoreFoundation 0x33c6f208 _CF_forwarding_prep_0 + 24
5 EventKit 0x3440af03 <redacted> + 30
6 EventKit 0x34410225 <redacted> + 396
7 EventKit 0x34410095 <redacted> + 28
8 EventKit 0x3440d3fd <redacted> + 396
9 Calendar 0x000f10a5 -[createNewEventView editEvent:] + 1696
10 UIKit 0x35c0f087 <redacted> + 70
11 UIKit 0x35c0f111 <redacted> + 120
12 UIKit 0x35c0f087 <redacted> + 70
13 UIKit 0x35c0f03b <redacted> + 30
14 UIKit 0x35c0f015 <redacted> + 44
15 UIKit 0x35c0e8cb <redacted> + 502
16 UIKit 0x35c0edb9 <redacted> + 488
17 UIKit 0x35b375f9 <redacted> + 524
18 UIKit 0x35b248e1 <redacted> + 380
19 UIKit 0x35b241ef <redacted> + 6198
20 GraphicsServices 0x3783b5f7 <redacted> + 590
21 GraphicsServices 0x3783b227 <redacted> + 34
22 CoreFoundation 0x33cea3e7 <redacted> + 34
23 CoreFoundation 0x33cea38b <redacted> + 138
24 CoreFoundation 0x33ce920f <redacted> + 1382
25 CoreFoundation 0x33c5c23d CFRunLoopRunSpecific + 356
26 CoreFoundation 0x33c5c0c9 CFRunLoopRunInMode + 104
27 GraphicsServices 0x3783a33b GSEventRunModal + 74
28 UIKit 0x35b782b9 UIApplicationMain + 1120
29 Calendar 0x000a9bbf main + 66
30 Calendar 0x0003a600 start + 40
What does such error means, and what is the possibilities for such error?
My implementation of editEvent method:
-(void) editEvent:(EKSpan )span
{
EKEvent * newEditingEvent = self.EventToEdit;
CalendarAppDataObject* theDataObject = [self theAppDataObject];
if(eventCalendar != nil && theDataObject.selectedCalendarsForDisplayData != nil){
NSArray *arrayDataUnarchiver =(NSArray *) [NSKeyedUnarchiver unarchiveObjectWithData:theDataObject.selectedCalendarsForDisplayData];
NSMutableSet * uniqueId = [[NSMutableSet alloc ] initWithArray:arrayDataUnarchiver];
[uniqueId addObject:eventCalendar.calendarIdentifier];
NSArray * selectedCal = [uniqueId allObjects];
NSData *arrayDataArchiver = [NSKeyedArchiver archivedDataWithRootObject:selectedCal];
theDataObject.selectedCalendarsForDisplayData = arrayDataArchiver;
//save selected to database
NSError *error;
self.managedObjectContext = theDataObject.managedObjectContext;
NSManagedObjectContext *context = [self managedObjectContext];
// **** log objects currently in database ****
// create fetch object, this objects fetch's the objects out of the database
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:#"Settings" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects= [context executeFetchRequest:fetchRequest error:&error] ;
for (NSManagedObject *info in fetchedObjects)
{
[info setValue:arrayDataArchiver forKey:#"selectedCalendarsForDisplayData"] ;
}
//this is for comitting changes to core data
[context save:&error];
[fetchRequest release];
[uniqueId release];
}
NSString * eventNotesString = #"";
if(self.eventNotes != nil)
{
eventNotesString = self.eventNotes;
}
newEditingEvent.notes = [EventsDataUtil generateEventsNoteForSavingColor:eventNotesString colorToSave:self.eventBackColor];
if(self.eventRecurrenceRule != nil)
{
NSArray * RecRulesArray = [[[NSArray alloc ] initWithObjects:self.eventRecurrenceRule, nil]autorelease];
if(theDataObject.isRepeatChanged)
{
[newEditingEvent setRecurrenceRules:RecRulesArray];
}
}else
{
[newEditingEvent setRecurrenceRules:nil];
}
if([[ self.eventTitle stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isEqualToString:#""])
{
self.eventTitle = #"New Event";
}
newEditingEvent.title = self.eventTitle;
if(isLocationPhoneNumber)
{
NSString * PhoneLocationString = #"tel:";
PhoneLocationString = [PhoneLocationString stringByAppendingFormat:#"%#", [self.contactPhoneNumber stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
newEditingEvent.location = PhoneLocationString;
}
else
{
newEditingEvent.location = self.eventLocation;
}
newEditingEvent.startDate = self.eventStartDate;
newEditingEvent.endDate =self.eventEndDate;
newEditingEvent.allDay = self.eventAllDay;
newEditingEvent.calendar = self.eventCalendar;
newEditingEvent.URL = self.eventURL;
// repeat and alert
NSArray * Alarms = nil;
if(self.eventAlert !=nil)
{
if(self.eventSecondAlert !=nil)
{
Alarms = [[[NSArray alloc] initWithObjects:self.eventAlert,self.eventSecondAlert, nil]autorelease];
}
else {
Alarms = [[[NSArray alloc] initWithObjects:self.eventAlert, nil]autorelease];
}
}
newEditingEvent.alarms = Alarms;
NSError *err;
[newEditingEvent setCalendar:self.eventCalendar];
[sharedEventStore saveEvent:newEditingEvent span:span commit:YES error:&err];
theDataObject.needUpdate = YES;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
[[NSNotificationCenter defaultCenter] postNotificationName:#"dismissEventDetails" object:nil];
}
else{
[self dismissViewControllerAnimated:YES completion:NULL];
}
}
The error report tells you everything you need to know:
[__NSArrayM relatedObjectDidChange]: unrecognized selector sent to instance
Which means that the NSArray class does not have a method called relatedObjectDidChange, so your code obviously calls this somewhere:
[someArray relatedObjectDidChange];
Without seeing your code, I cannot provide more help. I'd like to see this method:
[createNewEventView editEvent:]
and the definition of that class
The method relatedObjectDidChange is sent to an object of class NSArray which the class does not respond to. Did you mix up an NSMutableArray with an NSArray somewhere?
Or is relatedObjectDidChange a method that you did implement yourself on one of your objects? In that case you probably assigned an NSArray to a variable of which you expect to be of your very own class.
My application is attempting to use a zombie instance of something, though i have no idea where the problem is. the exception consistently occurs when invoking (IBAction)addTag:sender.
my stack trace is below:
2012-03-12 17:06:45.935 FavoriteTwitterSearches[3636:f803] -[__NSCFString addTag:]: unrecognized selector sent to instance 0x6a30d90
2012-03-12 17:06:45.943 FavoriteTwitterSearches[3636:f803] CRASH: -[__NSCFString addTag:]: unrecognized selector sent to instance 0x6a30d90
2012-03-12 17:06:45.947 FavoriteTwitterSearches[3636:f803] Stack Trace: (
0 CoreFoundation 0x013bc06e __exceptionPreprocess + 206
1 libobjc.A.dylib 0x0154dd0a objc_exception_throw + 44
2 CoreFoundation 0x013bdced -[NSObject doesNotRecognizeSelector:] + 253
3 CoreFoundation 0x01322f00 ___forwarding___ + 432
4 CoreFoundation 0x01322ce2 _CF_forwarding_prep_0 + 50
5 CoreFoundation 0x013bdec9 -[NSObject performSelector:withObject:withObject:] + 73
6 UIKit 0x000165c2 -[UIApplication sendAction:to:from:forEvent:] + 96
7 UIKit 0x0001655a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
8 UIKit 0x000bbb76 -[UIControl sendAction:to:forEvent:] + 66
9 UIKit 0x000bc03f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
10 UIKit 0x000bb2fe -[UIControl touchesEnded:withEvent:] + 549
11 UIKit 0x0003ba30 -[UIWindow _sendTouchesForEvent:] + 513
12 UIKit 0x0003bc56 -[UIWindow sendEvent:] + 273
13 UIKit 0x00022384 -[UIApplication sendEvent:] + 464
14 UIKit 0x00015aa9 _UIApplicationHandleEvent + 8196
15 GraphicsServices 0x012a6fa9 PurpleEventCallback + 1274
16 CoreFoundation 0x013901c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
17 CoreFoundation 0x012f5022 __CFRunLoopDoSource1 + 146
18 CoreFoundation 0x012f390a __CFRunLoopRun + 2218
19 CoreFoundation 0x012f2db4 CFRunLoopRunSpecific + 212
20 CoreFoundation 0x012f2ccb CFRunLoopRunInMode + 123
21 GraphicsServices 0x012a5879 GSEventRunModal + 207
22 GraphicsServices 0x012a593e GSEventRun + 114
23 UIKit 0x00013a9b UIApplicationMain + 1175
24 FavoriteTwitterSearches 0x00001fab main + 187
25 FavoriteTwitterSearches 0x00001ee5 start + 53
26 ??? 0x00000001 0x0 + 1
)
objc[3636]: EXCEPTIONS: finishing handler
Support Files/Main.m:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
void uncaughtExceptionHandler(NSException *exception);
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal;
#try {
retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
#catch (NSException *exception) {
NSLog(#"CRASH: %#", exception);
NSLog(#"Stack Trace: %#", [exception callStackSymbols]);
}
#finally {
[pool release];
}
return retVal;
}
Controller.m
#import "Controller.h"
#implementation Controller
- (id)init
{
if (self != nil)
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = [paths objectAtIndex:0];
filePath = [[NSString alloc] initWithString:[dir stringByAppendingPathComponent:#"tagsIndex.plist"]];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath] == NO)
{
tags = [[NSMutableDictionary alloc] init];
}
else
{
tags = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
}
buttons = [[NSMutableArray alloc] init];
infoButtons = [[NSMutableArray alloc] init];
}
return self;
}
- (void)awakeFromNib
{
for (NSString *title in tags)
[self addNewButtonWithTitle:title];
}
- (void)refreshList
{
for (UIButton *button in scrollView.subviews)
[button removeFromSuperview];
[infoButtons removeAllObjects];
float buttonOffset = BUTTON_SPACING;
for (UIButton *button in buttons)
{
CGRect buttonFrame = button.frame;
buttonFrame.origin.x = BUTTON_SPACING;
buttonFrame.origin.y = buttonOffset;
buttonFrame.size.width = scrollView.frame.size.width - BUTTON_SPACING - BUTTON_HEIGHT;
buttonFrame.size.height = BUTTON_HEIGHT;
button.frame = buttonFrame;
UIButton *infobutton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[infoButtons addObject:infobutton];
buttonFrame = infobutton.frame;
buttonFrame.origin.x = scrollView.frame.size.width - BUTTON_SPACING - SCROLLBAR_WIDTH;
buttonFrame.origin.y = buttonOffset;
infobutton.frame = buttonFrame;
[infobutton
addTarget:self action:#selector(infoButtonTouched:)
forControlEvents:UIControlEventTouchUpInside];
[scrollView addSubview:infobutton];
buttonOffset += BUTTON_HEIGHT + BUTTON_SPACING;
}
}
- (void)infoButtonTouched:sender
{
int index = [infoButtons indexOfObject:sender];
NSString *key = [[buttons objectAtIndex:index] titleLabel].text;
tagField.text = key;
NSString *value = [tags valueForKey:key];
queryField.text = value;
}
- (IBAction)addTag:sender
{
[tagField resignFirstResponder];
[queryField resignFirstResponder];
NSString *key = tagField.text;
NSString *value = queryField.text;
if (value.length == 0 || key.length == 0) return;
if ([tags valueForKey:key] == nil)
[self addNewButtonWithTitle:key];
[tags setValue:value forKey:key];
tagField.text = nil;
queryField.text = nil;
[tags writeToFile:filePath atomically:NO];
}
- (IBAction)clearTags:sender
{
[tags removeAllObjects];
[tags writeToFile:filePath atomically:NO];
[buttons removeAllObjects];
[self refreshList];
}
- (void)addNewButtonWithTitle:(NSString *)title
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:title forState:UIControlStateNormal];
[button
addTarget:self action:#selector(buttonTouched:)
forControlEvents:UIControlEventTouchUpInside];
[buttons addObject:button];
[buttons sortUsingSelector:#selector(compareButtonTitles:)];
[self refreshList];
CGSize contentSize = CGSizeMake(
scrollView.frame.size.width,
buttons.count * (BUTTON_HEIGHT + BUTTON_SPACING) + BUTTON_SPACING);
[scrollView setContentSize:contentSize];
}
- (void)buttonTouched:sender
{
NSString *key = [sender titleLabel].text;
NSString *search = [[tags valueForKey:key]
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = [NSString stringWithFormat:
#"http://search.twitter.com/search?q=%#", search];
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];
}
- (void)dealloc
{
[filePath release];
[tags release];
[infoButtons release];
[buttons release];
[super dealloc];
}
#end
#implementation UIButton (sorting)
- (NSComparisonResult)compareButtonTitles:(UIButton *)button
{
return [self.titleLabel.text caseInsensitiveCompare:button.titleLabel.text];
}
#end
[__NSCFString addTag:]: unrecognized selector sent to instance says thay you are calling method addTag: on an instance of type NSString.
Check to what object and how is your IBAction connected in your xib. If everything is okey, try to clean your project, reset your simulator, and then try it again.
EDIT: please, add a NSLog into your dealloc to check if your controller has not been deallocated.
It sounds like most likely a Controller object is getting deallocated prematurely. It's not possible from the code you've posted to tell where it's happening, but you should be able to track it down with Instruments (zombies and malloc stack logging in particular). Or, if Controller isn't used in a lot of places†, it might be quicker just to look there and see if you're mistakenly autoreleasing it.
†For an object called something like "Controller", I wouldn't bet on it, but it's worth mentioning and being able to easily track the life cycle of objects is a great incentive to reduce coupling in your program designs.
I am receiving an SIGABRT error on the last line of this code loginButton.enabled = YES;. It was working this morning and now this error comes up.
-(IBAction)login:(id)sender
{
UIButton *loginButton = (UIButton *)sender;
loginButton.enabled = NO;
NSString *filePath = [self dataFilePath];
if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
NSString *nameString = [[NSString alloc] init];
NSString *contactIdString = [[NSString alloc] init];
NSString *genderString = [[NSString alloc] init];
NSString *contactTypeString = [[NSString alloc] init];
nameString = [array objectAtIndex:0];
contactIdString = [array objectAtIndex:1];
genderString = [array objectAtIndex:2];
contactTypeString = [array objectAtIndex:3];
self.name = nameString;
self.contactId = contactIdString;
self.gender = genderString;
self.contactType = contactTypeString;
[self.userArray removeAllObjects];
[self performSelectorInBackground:#selector(sendData) withObject:nil];
[nameString release];
[contactIdString release];
[genderString release];
[contactTypeString release];
UIBarButtonItem *logoutButton = [[UIBarButtonItem alloc] initWithTitle:#"Logout" style:UIBarButtonItemStylePlain target:self action:#selector(logout:)];
//[logoutButton setTitle:#"Logout"];
[[self navigationItem] setRightBarButtonItem:logoutButton];
[logoutButton release];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"New User" message:#"It seems you have not used FaceDirectory before, please go to My Details and fill out the information then click save." delegate:self cancelButtonTitle:#"Ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
loginButton.enabled = YES;
}
Here is the error dump.
2011-08-12 11:41:56.700 FaceConnect[1651:207] Reachability Flag Status: -R ------- networkStatusForFlags
2011-08-12 11:41:59.247 FaceConnect[1651:207] selected first row
2011-08-12 11:42:02.344 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7a0cf10 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.344 FaceConnect[1651:207] -[__NSCFData setEnabled:]: unrecognized selector sent to instance 0x6f4b820
2011-08-12 11:42:02.344 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7a108b0 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.344 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e06e70 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.344 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e06220 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e06ca0 of class NSConcreteMutableData autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e068c0 of class NSURL autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e061c0 of class NSMutableURLRequest autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e069e0 of class NSCFString autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e06b30 of class NSCFString autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.345 FaceConnect[1651:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData setEnabled:]: unrecognized selector sent to instance 0x6f4b820' *** Call stack at first throw: (
0 CoreFoundation 0x0249d919 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x025eb5de objc_exception_throw + 47
2 CoreFoundation 0x0249f42b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x0240f116 ___forwarding___ + 966
4 CoreFoundation 0x0240ecd2_CF_forwarding_prep_0 + 50
5 FaceConnect 0x0000a7ea -[HubViewController login:] + 1802
6 UIKit 0x00123e14 -[UIApplication sendAction:to:from:forEvent:] + 119
7 UIKit 0x0032b14b-[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 156
8 UIKit 0x00123e14 -[UIApplication sendAction:to:from:forEvent:] + 119
9 UIKit 0x001ad6c8 -[UIControlsendAction:to:forEvent:] + 67
10 UIKit 0x001afb4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] +527
11 UIKit 0x001ae6f7 -[UIControltouchesEnded:withEvent:] + 458
12 UIKit 0x001472ff -[UIWindow _sendTouchesForEvent:] + 567
13 UIKit 0x001291ec -[UIApplication sendEvent:] + 447
14 UIKit 0x0012dac4 _UIApplicationHandleEvent + 7495
15 GraphicsServices 0x02924afa PurpleEventCallback + 1578
16 CoreFoundation 0x0247edc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__+ 52
17 CoreFoundation 0x023df737__CFRunLoopDoSource1 + 215
18 CoreFoundation 0x023dc9c3 __CFRunLoopRun + 979
19 CoreFoundation 0x023dc280 CFRunLoopRunSpecific + 208
20 CoreFoundation 0x023dc1a1 CFRunLoopRunInMode + 97
21 GraphicsServices 0x029232c8 GSEventRunModal + 217
22 GraphicsServices 0x0292338d GSEventRun + 115
23 UIKit 0x00131b58 UIApplicationMain + 1160
24 FaceConnect 0x00001ac9 main + 121
25 FaceConnect 0x00001a45 start + 53
26 ??? 0x00000001 0x0 + 1 )
2011-08-12 11:42:02.346 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x7e06a40 of class NSCFString autoreleased with no pool in place - just leaking
2011-08-12 11:42:02.346 FaceConnect[1651:6b07] *** __NSAutoreleaseNoPool(): Object 0x6f4c0c0 of class NSCFString autoreleased with no pool in place - just leaking terminate called after throwing an instance of 'NSException' Current language: auto; currently objective-c
I have just checked it on my iPhone, and the application does not crash. It only happens on the simulator.
-(IBAction)login:(id)sender {
[(UIButton*) sender setEnabled:NO];
if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
NSString* name = [array objectAtIndex:0];
NSString* contactId = [array objectAtIndex:1]; // depends if it is an integer then use int
NSString* gender = [array objectAtIndex:2];
NSString* contactType = [array objectAtIndex:3];
//[self.userArray removeAllObjects]; // what is your user array and why you are removing all the objects
// i could not find where you are setting the value for userArray
[self.userArray arrayWithObjects:self.name, self.contactId, self.gender,self.contactType, nil];
[self performSelectorInBackground:#selector(sendData) withObject:nil];
/*if (loginButton.selected == NO) {
// Represents user needs to login. Code for login user.
}else
{
[loginButton setTitle:#"Logout"];
}
// toggle the login/logout states.
loginButton.selected = !loginButton.selected;*/
UIBarButtonItem *logoutButton = [[UIBarButtonItem alloc] initWithTitle:#"Logout" style:UIBarButtonItemStylePlain target:self action:#selector(logout:)];
//[logoutButton setTitle:#"Logout"];
[[self navigationItem] setRightBarButtonItem:logoutButton];
[logoutButton release];
}
else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"New User" message:#"It seems you have not used FaceDirectory before, please go to My Details and fill out the information then click save." delegate:self cancelButtonTitle:#"Ok" otherButtonTitles:nil];
[alert show];
[alert release];
}
[(UIButton*) sender setEnabled:YES];
}
i could not find where you are setting the value for userArray and so i thought i think you are binding the info to userArray and sending
-(id)sendData{
//Do whatever you want to do with userArray
}
-(void)viewDidUnLoad{
self.userarray = nil;
[super viewDidlUnload];
}
-(void)dealloc{
[userArray release];
[super dealloc];
}
You create an empty strings with alloc/init, and then you change them to value returned by objectAtIndex:. This causes the pointer to point to an autoreleased value. After you release your strings, the application will crash because retain count will become less than zero.
I guess the error is propagating from FaceConnect. Please check, it's showing a lot of leaks and warnings.
So, i'm using core data with multiple thread. each one gets his own Managed object context.
I get an unrecognized selector exception , so I'm curious if I'm doing something wrong.
The crash is obviously related to the "mergeChanges" method.
I would greatly appreciate any help.
Edit
The problem seems to be that the myManagedObjectContext returns a deallocated object.
How could that be ?
My code:
- (NSManagedObjectContext *) myManagedObjectContext {
NSManagedObjectContext * result = [[[NSThread currentThread] threadDictionary] objectForKey: AQPerThreadManagedObjectContext];
if ( result != nil )
return result;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator!=nil)
{
NSManagedObjectContext * moc = [[NSManagedObjectContext alloc] init];
[moc setMergePolicy: NSMergeByPropertyObjectTrumpMergePolicy];
[moc setPersistentStoreCoordinator: coordinator];
[self StoreManagedObjectContextForCurrentThread:moc];
[moc release]; // now owned by the thread dictionary
return moc ;
}
else {
GTMLoggerError(#"FAILED TO return managed object context ");
}
return nil;
}
-(void) StoreManagedObjectContextForCurrentThread:(NSManagedObjectContext*) context
{
[[[NSThread currentThread] threadDictionary] setObject: context forKey: AQPerThreadManagedObjectContext];
}
-(BOOL) saveChanges
{
BOOL success = YES;
NSManagedObjectContext* moc = [self myManagedObjectContext];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:#selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:moc];
NSError *error = nil;
if ([moc save:&error] == NO)
{
success = NO;
GTMLoggerError(#"Failed to save to data store: [%#], [%#]",
[error localizedDescription],
[error userInfo]);
}
return success;
}
- (void)mergeChanges:(NSNotification *)notification
{
NSManagedObjectContext* moc = [self myManagedObjectContext];
AppDelegate * delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [delegate mainThreadMOC];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:#selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
mainThreadMOC = [[NSManagedObjectContext alloc]init];
[mainThreadMOC setMergePolicy: NSMergeByPropertyObjectTrumpMergePolicy];
[mainThreadMOC setPersistentStoreCoordinator: [[DatabaseManager sharedManager] persistentStoreCoordinator]];
[[DatabaseManager sharedManager] StoreManagedObjectContextForCurrentThread:mainThreadMOC];
.....
.....
}
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSKeyPathExpression _processReferenceQueue:]: unrecognized selector sent to instance 0xa65940'
0 CoreFoundation 0x3587a987 __exceptionPreprocess + 114
1 libobjc.A.dylib 0x34a8249d objc_exception_throw + 24
2 CoreFoundation 0x3587c133 -[NSObject(NSObject) doesNotRecognizeSelector:] + 102
3 CoreFoundation 0x35823aa9 ___forwarding___ + 508
4 CoreFoundation 0x35823860 _CF_forwarding_prep_0 + 48
5 CoreData 0x356ea3d5 -[NSManagedObjectContext(_NSInternalNotificationHandling) _processReferenceQueue:] + 24
6 CoreData 0x3573032b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 842
7 CoreFoundation 0x35818bbf -[NSObject(NSObject) performSelector:withObject:] + 22
8 Foundation 0x31181795 __NSThreadPerformPerform + 268
9 CoreFoundation 0x358307dd __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
10 CoreFoundation 0x358025b7 __CFRunLoopDoSources0 + 382
11 CoreFoundation 0x35801e5b __CFRunLoopRun + 230
12 CoreFoundation 0x35801c87 CFRunLoopRunSpecific + 230
13 CoreFoundation 0x35801b8f CFRunLoopRunInMode + 58
14 GraphicsServices 0x320c84ab GSEventRunModal + 114
15 GraphicsServices 0x320c8557 GSEventRun + 62
16 UIKit 0x341dc329 -[UIApplication _run] + 412
17 UIKit 0x341d9e93 UIApplicationMain + 670
Not sure if this is the problem, but you should always return autoreleased-values from a function.
You're doing:
[moc release]; // now owned by the thread dictionary
return moc ;
but regardless of the ownership in the thread-dictionary, it should be:
return [moc autorelease];