2012-07-27 65 views
3

我有下面的代码:为什么系统调用UIApplicationDelegate的dealloc方法?

// create new delegate 
MyCustomApplicationDelegate *redelegate = [[MyCustomApplicationDelegate alloc] init]; 
redelegate.delegate = [(NSObject<UIApplicationDelegate42> *)[UIApplication sharedApplication].delegate retain]; 

// replace delegate 
[UIApplication sharedApplication].delegate = redelegate; 

... 
[UIApplication sharedApplication].delegate = redelegate.delegate; 
[redelegate.delegate release]; 

最后一行称为基UIApplicationDelegate类的dealloc方法系统后。 那么,为什么?我读到的UIApplication苹果文档,有关委托财产:

@属性(非原子,分配)的ID代表

讨论的代表必须采用UIApplicationDelegate正式 协议。 UIApplication指定并不保留委托。

它清楚地表明,UIApplication指定并不保留委托。那么,为什么它会摧毁我的基地代表?

回答

5

UIApplication有一些不寻常的行为。第一次在UIApplication上设置委托属性时,旧的委托被释放。每次之后,当您设置委托属性时,旧委托不会被释放。

在UIApplication.h委托财产的声明是:

@property(nonatomic,assign) id<UIApplicationDelegate> delegate; 

这意味着共享的UIApplication将永远不会调用保留或释放的委托。这对于委托模式是正常的:类通常不保留它的委托,因为这会导致保留循环。

但是在这种情况下,存在一个不寻常的问题:谁拥有该应用的第一个代理?在main.m中,调用UIAplicationMain()隐式地分配并注入第一个委托,这使委托的保留数为1.有人必须释放该委托,但没有类来拥有它。为了解决这个问题,每当你第一次在UIApplication上设置一个新的委托时,它就释放第一个委托。新代表被您的应用程序中的某个类分配并启动,因此您已经拥有对新代表的引用。 UIApplication不保留或释放新代表。

+0

感谢这个伟大的评论 – 2013-01-11 08:07:51

0

我不认为你应该改变这样的UIApplication sharedApplication委托。您的应用的标准委托自动成为[UIApplication sharedApplication]委托。所以也许你应该把所有的自定义代码放在普通的代理中?

+0

好的,但我的问题是不同的 – 2012-07-27 09:43:36

0

我有一个想法,以后这个老代表:

[UIApplication sharedApplication].delegate = redelegate.delegate; 

将被释放。

但是,当我看到这

@property(nonatomic, assign) id<UIApplicationDelegate> delegate 

我在想,这应该不是(因为分配

你同不同意?

相关问题