Objective-C委托指针

Objective-C委托指针,objective-c,Objective C,如果我们编写以下代码: ExplorerAppDelegate * appDelegate = (ExplorerAppDelegate *)[[UIApplication sharedApplication] delegate]; 这将引用原始委托指针,但: 它会增加引用计数吗 我们必须立即显式地调用as[ExplorerAppDelegate retain],还是根本不调用 到底发生了什么事 使用此方法后,我们还应该在dealloc方法中执行[ExplorerAppDelegate r

如果我们编写以下代码:

ExplorerAppDelegate * appDelegate = (ExplorerAppDelegate *)[[UIApplication sharedApplication] delegate];
这将引用原始委托指针,但:

  • 它会增加引用计数吗
  • 我们必须立即显式地调用as
    [ExplorerAppDelegate retain]
    ,还是根本不调用
  • 到底发生了什么事
使用此方法后,我们还应该在dealloc方法中执行
[ExplorerAppDelegate release]
,对吗

  • 引用计数将不会增加
  • 如果您想确保在有指向它的指针时它没有被释放,那么应该保留它
  • 只有在保留它的情况下才应该释放它

  • 因此,基本上,如果只在单个函数中使用对象,则可能不需要保留或释放它。如果在您获得它时它就存在,那么(可能)在函数结束时它不会被释放。如果要保留它,例如在ivar(成员变量)中,则应保留它并在以后释放。

    否,它不会增加保留计数

    Objective-C中的约定是,给你的对象应该是由你自己管理的内存-但是在获得像应用程序委托这样的共享公共资源的情况下,内存在别处维护,当然(这就是应用程序委托),你知道只要你的类是。。。因此,没有必要保留引用

    在委托的大多数使用中,不是获取委托,而是获得一个委托,并且该引用也不会保留。在这种情况下,无论是谁给了您该委托,都会响应在该委托被释放之前清除委托链接的请求


    通常不希望保留委托引用的原因是,它可以防止某些对象被释放,例如,如果一个类是将另一个类用作委托的类的委托。

    有关正式答案,请参阅中的“对对象的弱引用”。指向委托的指针是内存管理规则可能出现的异常情况之一。

    这些都是有效的,而且完全正确。但是由于应用程序委托是在应用程序启动时创建的,并且永远不会释放(至少在终止之前不会释放),因此您可以简单地保留引用,而不是保留它,并完全忽略该问题。在这种情况下,您知道引用将在应用程序的生命周期内保持有效。