检测双重自由物体,释放或不释放

时间:2010-06-02 15:01:48

标签: objective-c cocoa memory-management

如果我们在接口.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,抱歉!

4 个答案:

答案 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就停止了对象地址的错误,控制台中对象的打印给了我确切的对象,而这个对象不在我发布的那些视图中,所以问题出现在调用我后续观点的第一个视图中......

感谢,

的问候,

米。

相关问题