【问题标题】:Objective c - call method on dealloc delegateObjective c - 对 dealloc 委托的调用方法
【发布时间】:2012-06-02 22:04:41
【问题描述】:

我有一个对象Person 和一个协议PersonDelegate
Person 有一个@property (assign) id<PersonDelegate> delegate

在我的代码中的某个地方:

Person *newPerson = [[Person alloc] init]; 
newPerson.delegate = theDelegate;  
...  
[theDelegate release]; // and dealloc

...

now Person has some new information for the delegate, so I call in Person
[self.delegate doSomething];

但后来我得到 EXC_BAD_ACCESS

这是因为委托已经解除分配了吗? Person 怎么知道他的委托是 dealloc?

【问题讨论】:

    标签: objective-c ios delegates dealloc retaincount


    【解决方案1】:

    您的委托属性未设置为保留,因此一旦您这样做,它就会变坏[theDelegate release];

    通常,委托设置为分配,以避免循环引用。但在这种情况下,委托本身通常已经保留了对其委托的对象的引用。

    即。

    Person *newPerson = [[Person alloc] init]; 
    [self.people addObject:newPerson];
    newPerson.delegate = self;
    [newPerson release];
    

    所以self.people 保留所有已创建的persons,而那些persons 都指向self 作为他们的代表

    【讨论】:

      【解决方案2】:

      假设你真的想要assign.... :)

      您可以将newPerson 保存为属性,并在释放委托对象之前将其委托设置为nil。 您可以让 Person 对象监听代理即将离开的通知,并将其自行设置为 nil。

      【讨论】:

      • 但是当你可以保留它并在人的 dealloc 中释放它时,为什么还要费尽心思呢?
      • 我不知道,但我想可能有我想不出的原因。苹果为什么要为 UIWebViewDelegate 做呢?
      • 当代表是assign 时,我相信程序员有责任让他们在需要时保持活力。如果你需要尽早摧毁它,你可以使用我建议的任何一种策略。
      【解决方案3】:

      您正在分配您的代表,而不是保留它。 由于您释放了您的委托,它在您的个人对象中不再有效,因为它没有被它保留。

      将您的委托属性更改为:

      @property (retain) id<PersonDelegate> delegate;

      当你释放你的 person 对象时不要忘记释放它

      【讨论】:

      • 可能是因为大多数委托是视图控制器或对象,它们的寿命超过了对象本身。在这种情况下,他清楚地立即释放了委托
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多