objective-c - Objective C - dealloc 委托(delegate)上的调用方法

标签 objective-c ios delegates dealloc retaincount

我有一个对象Person和协议(protocol)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

这是因为委托(delegate)已经被释放了吗? Person 如何知道他的委托(delegate)已释放?

最佳答案

您的委托(delegate)属性未设置为保留,因此一旦您执行[theDelegate release];

,它就会变坏

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

即。

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

因此,self.people 保留了所有创建的person,并且这些person 都指向self > 作为他们的委托(delegate)

关于objective-c - Objective C - dealloc 委托(delegate)上的调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786328/

相关文章:

ios - 如何制作带有可选圆角和边框的 UIView?

ios - 将 inputAccessoryView 与多个 UITextField 和 ViewController 一起使用

ios - 使用 AVPlayer-Swift 无缝循环播放视频

ios - 与委托(delegate)的内存管理?

iphone - 如何让 SQLITE 数据库文件在 DropBox 中同步?

objective-c - 在 objective-c 中保留可变和不可变对象(immutable对象)的计数?

ios - 如何仅使用 Storyboard 更改方向更改的 View 位置

xcode - 是否可以编写移动 Safari 扩展程序?

reflection - 使用反射创建 Action<'T> 的实例

android - 委托(delegate)触摸事件