2012-03-01 108 views
0

我有类UNetwork是UIViewController的子类。调用UIViewController,永远不会被释放

当用户按下按钮我使用此代码调用它:

OTNetwork *net = [[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil]; 

[self presentModalViewController:net animated:YES]; 

[net release]; 

当用户想要退出,按下按钮和OTNetwork对象发送通知,使得呼叫者的ViewController驳回视图控制器。这是代码:

[self dismissModalViewControllerAnimated:YES]; 

我的问题是OTNetwork对象dealloc方法从来没有被调用过。这是对从未停止过的定时器的无效调用。内存泄漏是一个附带问题。

在调用者视图控制器中,此对象仅由这些代码行创建和解除。

请帮忙吗?

在此先感谢!

回答

1

Autorelease不会保证何时调用dealloc,你不应该依赖它。

而且autorelease池应该用于线程或者当你在闭环中有大的内存分配时。它不应该在已经在单独池中运行的主线程上使用。

您应该将无效定时器调用移动到OTNetwork类中的viewDidUnload或viewWillDisappear。

希望有所帮助。

[更新:2012年3月2日]

如果你想确保的dealloc被调用时,请尝试以下

1)商店OTNetwork控制器

OTNetwork *net = [[OTNetwork alloc] initWithNibName: @"OTNetwork" bundle: nil]; 
net.delegate = self; 
self.modalV = net; // @property (nonatomic, strong) OTNetwork *modalV; 
[net release]; 

[self presentModalViewController: modalV animated: YES]; 

参考2)在OTNetwork中定义一个协议/代理以在其关闭时报告返回

// .h 
@protocol OTNetworkDelegate; 
    - (void) netViewClosed; 
@end 

// .m 
- (void) viewDidUnload 
{ 
    [self.delegate netViewClosed]; 
} 

3)在mainViewController中,执行协议

- (void) netViewClosed 
{ 
    if(modalV) 
    { 
     [modalV release], modalV = nil; 
    } 
} 
+0

感谢您的答案,但因为我不坚定,当一种方法创建一个对象,并且必须返回它,它必须是autorelease权限?在这种情况下,我怎样才能假设它将被释放?通过这个方法的调用者? – NemeSys 2012-03-02 17:56:01

+1

对象分配和返回是一个不同的问题,但是,你可以自动释放一个但是,在当前问题的上下文中,如果要确保调用dealloc,请保留对“net”对象的引用,然后手动将其释放当viewcontroller关闭时,为了知道什么时候viewcontroller解散了,你可能需要设置一个委托来回报给调用控制器。请在上面回答我的答案,包括如何去做。 – vipinagg 2012-03-02 18:29:15

1

当你将OTNetwork对象传递给自我时,我假设它是一个navigationController,那么你的OTNetwork对象在发布池中,并且你不需要担心它被释放也会导致你的代码在内存中很好管理。

所以,简单的答案,它在自动释放池

+0

是的,我假设这一点,但问题是,从未调用dealloc函数。由于记忆,程序崩溃。:( – NemeSys 2012-03-01 17:03:33

+0

也许你的应用程序正在保留或分配该视图控制器在其他地方,然后它被释放的autorelease池,但该类再次访问 – 2012-03-02 16:53:22

1

,你可以尝试一下本作的dealloc被调用,通过使用自己的自动释放池。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
try{ 
//your code for allocating that object 
OTNetwork *net = [[[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil] autorelease]; [self presentModalViewController:net animated:YES]; 
} 
finally{ 
[pool drain]; 
} 
相关问题