如果我们在接口.h文件中有此代码:
@interface CarModelSelectViewController : UITableViewController {
NSString *fieldNameToStoreModel;
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
DataEntered *dataEntered;
}
@property (nonatomic, retain) NSString *fieldNameToStoreModel;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) DataEntered *dataEntered;
@end
在我们的实施文件.m中,我们必须:
- (void)dealloc {
[fieldNameToStoreModel release];
[fetchedResultsController release];
[managedObjectContext release];
[dataEntered release];
[super dealloc];
}
从以前的UIViewController分配4个对象,如下所示:
UIViewController *detailViewController;
detailViewController = [[CarModelSelectViewController alloc] initWithStyle:UITableViewStylePlain];
((CarModelSelectViewController *)detailViewController).dataEntered = self.dataEntered;
((CarModelSelectViewController *)detailViewController).managedObjectContext = self.managedObjectContext;
((CarModelSelectViewController *)detailViewController).fieldNameToStoreModel = self.fieldNameToStoreModel;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
现在存在于新UIViewController中的对象与之前的UIViewController相同,我无法在新的UIViewController中释放它们?
问题在于,有时候,当我离开新的UIViewController并转到上一个时,我的应用程序崩溃了,并非总是如此。通常我得到的错误是双重自由对象。
我使用过malloc_error_break,但我仍然不确定该对象是什么。
有时候我可以从之前的UIViewController转到下一个UIViewController并返回4到5次,然后出现双重自由对象。
如果我没有发布任何对象,一切正常,仪器表示没有内存泄漏......
所以,最后一个问题,我应该在这里发布这些对象吗?
谢谢,
米。
编辑:
fetchedResultsController.delegate总是为nil,因为在此视图中,获取的对象不会更改,并且NSFetchedResultsControllerDelegate不在@interface .h文件中。
编辑2:
添加了接口文件的声明propoerties,抱歉!
答案 0 :(得分:2)
您在dealloc
方法中发布它们是正确的。似乎他们在其他地方被释放了。我建议您使用启用了NSZombieEnabled
的仪器。 (使用对象分配工具,单击“i”按钮,然后选中“启用NSZombie检测”。我相信它需要您使用模拟器。)当找到僵尸时,您可以跟踪对象的生命周期和确切地看到它被保留和释放的位置。
答案 1 :(得分:1)
如果你关心一个物体,你就保留它。如果保留它,则将其释放。这是所有的法律,其余的只是评论。
您很可能错误地声明了@properties并且未能在其中包含“retain”属性。
请注意,您应该将detailViewController
声明为CarModelSelectViewController*
,而不是将其声明为UIViewController
,然后在每次使用时将其投射。
您应该阅读Memory Management Programming Guide,特别是Practical Memory Management。可可内存管理实际上非常简单。如果你总是使用访问器并学习three magic words,你将很少遇到麻烦。
答案 2 :(得分:0)
如果您正在为CarModelViewSelectController
进行任何自定义初始化,那么我们就可以看到它。
另外,您的UINavigationControllerDelegate
正在进行任何内存管理吗?
答案 3 :(得分:0)
最后我找到了: - )
一旦启用了malloc_error_break,XCode就停止了对象地址的错误,控制台中对象的打印给了我确切的对象,而这个对象不在我发布的那些视图中,所以问题出现在调用我后续观点的第一个视图中......
感谢,
的问候,
米。