3

我有下一个代码:

// 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 文档,关于委托属性:

@property(nonatomic, assign) id 委托

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

它清楚地表明 UIApplication 分配并且不保留委托。那么,为什么它会破坏我的基础委托?

4

3 回答 3

6

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

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

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

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

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

于 2013-01-11T03:22:28.123 回答
0

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

于 2012-07-27T09:34:02.607 回答
0

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

[UIApplication sharedApplication].delegate = redelegate.delegate;

将会被释放。

但是当我看到这个

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

我认为它不应该(因为分配

你是否同意我的观点?

于 2012-07-27T10:03:09.303 回答