目标c - 对dealloc委托的调用方法

时间:2012-05-28 14:32:48

标签: objective-c ios delegates dealloc retaincount

我有一个对象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

这是因为委托已经是dealloc吗?人怎么能知道他的代表是dealloc?

3 个答案:

答案 0 :(得分:1)

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

将您的委托属性更改为:

@property (retain) id<PersonDelegate> delegate;

并且不要忘记在释放你的人物对象时释放它

答案 1 :(得分:1)

您的委托属性未设置为保留,因此只要您[theDelegate release];

它就会变坏

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

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

因此self.people保留所有已创建的persons,而persons所有self都指向{{1}}作为其代理人

答案 2 :(得分:1)

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

您可以将newPerson保存为属性,并在释放委托对象之前将其委托设置为nil。 你可以让一个Person对象听取委托将要离开的通知,并让它自己设置为nil。