为什么系统调用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的Apple文档,关于代理财产:

@属性(非primefaces,分配)ID委托

讨论委​​托人必须采用UIApplicationDelegate正式协议。 UIApplication分配并不保留委托。

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

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

UIApplication.h中委托属性的声明是:

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

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

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

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

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

 [UIApplication sharedApplication].delegate = redelegate.delegate; 

将会被释放。

但是当我看到这个

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

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

你是否同意我的观点?