【问题标题】:Release a viewController correctly that sets it self as delegate to other classes?正确发布一个视图控制器,将它自己设置为其他类的委托?
【发布时间】:2011-04-27 22:51:59
【问题描述】:

我要做的第一件事是创建一个 ViewController 并将其推送到导航控制器。

viewController = [[MyViewController alloc] init];
[navController pushViewController:viewController animated: NO];
[viewController release];

现在保留计数为 2(pushViewController 使用 2 保留显然但不是我的责任)到目前为止还不错。

在 MyViewController 中,我正在创建一个类的实例并将 ViewController 设置为实例的委托。

timer = [[MyBackgroundTimer alloc] initWithInterval:20];
[timer setDelegate:self];

现在由于 setDelegate,viewControllers 的保留计数增加了 1:

但是当我稍后释放 viewController 时,它永远不会调用 dealloc,因为我还有一个保留计数。

当你将自己设置为委托时,你应该如何正确地减少保留计数?

【问题讨论】:

    标签: iphone objective-c ios ipad


    【解决方案1】:

    不要保留您的代表。如果您使用的是属性,请将您的委托定义为分配,而不是保留。其他人需要保留您的代表,而不是您。

    【讨论】:

      【解决方案2】:

      您的类MyBackgroundTimer 应该将委托属性设置为assign 而不是retain。

      @property (nonatomic, assing) id delegate;
      

      并且这个类应该在需要使用时保留委托,并在使用完成时释放。

      @implementation MyBackgroundTimer 
      
      @synthesize delegate;
      
      -(void) startTimer {
      
          [self.delegate retain];
      
          //... do some actions
      
      }
      
      
      -(void) timerStopped {
      
          //... call delegate methods
      
          [self.delegate release]
      
      }
      
      @end
      

      请务必记住,您可以将您的委托作为保留属性。但是要以正确的方式这样做,您必须确保在调用 dealloc 之前释放它(如上例中的 timerStopped 方法)

      我这么说是因为如果你尝试在 dealloc 方法中释放委托,则实例化 MyBackgroundTimer 的类与委托是同一个类,并且它也在 dealloc 中释放 MyBackgroundTimer(这几乎是常见情况),永远不会调用两个类的 dealloc 方法,因为每个类都将拥有另一个类的所有权,从而导致内存泄漏(这将不会在仪器上显示)。

      【讨论】:

      • 你不应该保留你的代表。当MyViewController准备dealloc时,要么释放MyBackgroundTimer,要么将MyBackgroundTimer的delegate设置为nil。
      • 有没有读过答案?这就是我在“你的类 MyBackgroundTimer 应该将委托属性作为分配而不是保留。”中所说的......你知道分配是什么意思吗?
      • ……然后你继续说,“这个班级应该保留代表……”我误读了你的答案吗?
      • 是的,你是......“而且这个类应该在它需要使用它的时候保留委托(......)但是要以正确的方式这样做,你必须确保你释放它在调用 dealloc 之前“......这就是内存管理指南基本章节中描述的内容...... cmon man,在投票之前阅读漏洞答案......
      • 最好的情况是不需要保留你的委托,最坏的情况是你会得到一个循环引用并泄漏两个对象。内存管理指南中的哪些地方说您需要在发送消息之前保留委托?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多