【问题标题】:Why system call UIApplicationDelegate's dealloc method?为什么系统调用UIApplicationDelegate的dealloc方法?
【发布时间】:2012-07-27 09:26:45
【问题描述】:

我有下一个代码:

// 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 委托

讨论delegate必须采用UIApplicationDelegate形式 协议。 UIApplication 分配但不保留委托。

它明确表示 UIApplication 分配而不保留委托。那么,为什么它会破坏我的基础委托?

【问题讨论】:

    标签: ios


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,但我的问题不同
      【解决方案3】:

      在这之后我有个老代表的想法:

      [UIApplication sharedApplication].delegate = redelegate.delegate;
      

      将被释放。

      但是当我看到这个

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

      我认为它不应该(因为 assign

      你同意我的观点吗?

      【讨论】:

        猜你喜欢
        • 2012-11-30
        • 2020-12-10
        • 1970-01-01
        • 2014-09-28
        • 2018-11-10
        • 1970-01-01
        • 2011-02-18
        • 2015-10-05
        相关资源
        最近更新 更多