gpt4 book ai didi

iphone - 在没有来自 NSZombieEnabled 的任何有用消息的情况下获取 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 19:35:36 26 4
gpt4 key购买 nike

我是 iphone 开发的新手,我一直在努力解决几天前遇到的 EXC_BAD_ACCESS 错误。我基本上是独立学习斯坦福大学的 iPhone 类(class),并且尝试将 NSManagedObjects 数组传递给应该显示它们的 TableViewController。应用程序在模拟器中启动并在 tableView 中显示数据,但它立即出错并显示 EXC_BAD_ACCESS。

我按照此处和其他地方的说明进行操作,了解如何使用 NSZombieEnabled 来识别过早释放的对象,但即使使用 NSZombieEnabled,这个也没有任何有用的消息。我的猜测是,它一定是由于尝试访问未通过释放/自动释放释放的未分配内存而引起的。否则它会像我能够修复的其他错误一样被拾取为僵尸对象。我不是 C 专家,但这是否意味着如果我声明一个对象并向其发送消息而不实例化它,可能会发生类似的情况?我查看了我的代码,看看是否有类似的东西,结果却一无所获。

我在调试器中有堆栈跟踪,但我不知道如何使用它。我有点沮丧,因为我无法在代码中使用断点来进一步缩小问题范围,因为它似乎是在应用程序完成加载后发生的。我认为如果没有可能的用户交互,应用程序就会保持空闲状态。它是否在加载的尾部失败,我无法轻易看到它,或者加载完成后只是在后台做一些事情。我非常感谢有关如何阅读堆栈跟踪的任何提示。

我在下面输入了我的堆栈跟踪(无法弄清楚如何从调试器复制它)


0 objc_msgSend<br/>
1 ??<br/>
2 -[NSManagedObject dealloc]<br/>
3 -[_PFManagedObjectReferenceQueue _processReferenceQue:]<br/>
4 _performRunLoopAction<br/>
5 ___CFRunLoopDoObservers<br/>
6 CFRunLoopRunSpecific<br/>
7 CFRunLoopRunInMode<br/>
8 GSEventRunModal<br/>
9 GSEventRun<br/>
10 UIApplicationMain<br/>
11 main

我的程序中的两个主要类是顶级委托(delegate)类及其调用的 ViewTableController。

`- (void)applicationDidFinishLaunching:(UIApplication *)application {

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];

personListViewController.title=@"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];
}

如果我的代码太糟糕而难以阅读,我深表歉意。

谢谢大家的帮助。

最佳答案

这是您的问题:

NSString *contactName = [photo objectForKey:@"user"];
... a bunch of lines later
[contactName release];

objectForKey: 返回一个autoreleased 对象,您不应该释放它。

同样,insertNewObjectForEntityForName:inManagedObjectContext:managedObjectContext 返回一个 autoreleased 对象,因此删除 [image release][contact release]

关于iphone - 在没有来自 NSZombieEnabled 的任何有用消息的情况下获取 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459320/

26 4 0