我是iphone開發的新手,我一直在掙扎着前兩天我得到的EXC_BAD_ACCESS錯誤。我基本上採取斯坦福iphone類獨立,我想傳遞一個NSManagedObjects數組到一個應該顯示它們的TableViewController。應用程序在模擬器中啓動,並在tableView中顯示數據,但它會立即通過EXC_BAD_ACCESS出錯。從NSZombieEnabled獲取EXC_BAD_ACCESS沒有任何有用信息
我遵循這裏和其他地方的說明如何使用NSZombieEnabled來識別過早發佈的對象,但是這個來沒有任何有用的消息,即使NSZombieEnabled。我的猜測是它必須是由試圖訪問未通過release/autorelease釋放的未分配內存引起的。否則它會被視爲殭屍對象,就像我已經能夠修復的其他錯誤一樣。我不是c專家,但是這意味着如果我要聲明一個對象併發送消息而沒有實例化它,那麼這可能會發生嗎?我查看了我的代碼,看看我是否有類似的東西,然後空着。
我在調試器中有堆棧跟蹤,但我不確定如何使用它。我有點沮喪,因爲我不能在代碼中使用斷點來進一步縮小問題的範圍,因爲它似乎發生在應用程序加載完成後。我認爲如果沒有可能的用戶交互,應用程序將保持閒置狀態。是否在負載的尾端發生故障,我不能輕易看到它,或者在完成加載後在後臺執行某些操作。我非常感謝有關如何閱讀堆棧跟蹤的任何提示。
我輸入了我下面的堆棧跟蹤(無法弄清楚如何將它從調試器複製)
0 objc_msgSend
1 ??
2 -[NSManagedObject dealloc]
3 -[_PFManagedObjectReferenceQueue _processReferenceQue:]
4 _performRunLoopAction
5 ___CFRunLoopDoObservers
6 CFRunLoopRunSpecific
7 CFRunLoopRunInMode
8 GSEventRunModal
9 GSEventRun
10 UIApplicationMain
11 main
而且我在程序的兩大類是頂級的委託類和它調用的ViewTableController。
` - (無效)的applicationDidFinishLaunching:(UIApplication的*)應用{
self.tabBarController = [[[UITabBarController alloc] init] autorelease];
UINavigationController *contactsNavigationController = [[self createContactsNavigationController] retain];
//UINavigationController *recentsNavigationController = [[self createRecentsNavigationController:photos] retain];
tabBarController.viewControllers = [[NSArray alloc] initWithObjects: contactsNavigationController, nil];
[contactsNavigationController release];
//[recentsNavigationController release];
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
}
- (UINavigationController的*)createContactsNavigationController {
UINavigationController *contactsNavigationController = [[UINavigationController alloc] init];
UITabBarItem *contactsTabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem: UITabBarSystemItemContacts tag:0];
contactsNavigationController.tabBarItem=contactsTabBarItem ;
[contactsTabBarItem release];
PersonListViewController *personListViewController = [[PersonListViewController alloc] initWithStyle:UITableViewStylePlain];
NSManagedObjectContext *context = [self managedObjectContext];
personListViewController.managedObjectContext=context;
personListViewController.contacts = [self createContacts];
[context release];
[email protected]"Contacts";
[contactsNavigationController pushViewController:personListViewController animated:false];
return [contactsNavigationController autorelease];
}`
` - (NSArray *)readContacts {
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *filePath = [path stringByAppendingPathComponent:@"FakeData.plist"];
NSArray *plist = [[NSMutableArray arrayWithContentsOfFile:filePath] retain];
return [plist autorelease];
}
- (NSMutableArray *)createContacts {
NSArray * plist = [[self readContacts] retain
NSMutableArray *contactNames = [[NSMutableArray alloc] init];
NSMutableArray *contacts = [[NSMutableArray alloc] init];
for (NSDictionary *photo in plist) {
NSString *contactName = [photo objectForKey:@"user"];
Person *contact = nil;
if (![contactNames containsObject:contactName]) {
contact = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
contact.name =contactName;
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"SHIT the save person FAILED!!! %@",error);
}
[contacts addObject:contact];
[contactNames addObject:contactName];
} else {
contact = [contacts objectAtIndex:[contactNames indexOfObject:contactName]];
}
[contactName release];
Photo *image = (Photo *)[NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:managedObjectContext];
image.imageFile = [photo objectForKey:@"path"];
image.imageName = [photo objectForKey:@"name"];
image.owner = contact;
contact.photos = [NSSet setWithObjects:image,nil];
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"SHIT the save photoFAILED!!! %@",error);
}
[image release];
[contact release];
}
[plist release];
return [contacts autorelease];
}
我很抱歉如果我的代碼太糟糕了,無法閱讀。
感謝您的幫助球員。
你能告訴我們回溯和與之相關的代碼嗎? –