objective-c - 您应该在使用委托(delegate)的类中还是在类本身中将委托(delegate)设置为 nil

标签 objective-c memory-management delegates

如果A类正在使用B类并且A类是B类的委托(delegate),那么在B类的dealloc中将委托(delegate)设置为nil可以吗?我看到代码通常在 A 类的 dealloc 中将委托(delegate)重置为 nil,但不确定以这种方式或另一种方式进行真正的区别。

例如这是通常的方式:

// somewhere in class A

- (void) someFunc {
  self.b = [[B alloc] init];
  self.b.delegate = self;
}

- (void) dealloc {
  self.b.delegate = nil;
  [self.b release];
}

最佳答案

是的,您应该在 classA 的 dealloc 中将 classB 的委托(delegate)属性设置为 nil。

这不是内存管理问题,因为委托(delegate)属性应该标记为分配,而不是保留,以避免循环保留(否则永远不会调用 dealloc)。问题在于,否则 classB 可能会在发布后向 classA 发送消息。

例如,如果 classB 有一个 delagate 调用说“被隐藏”,并且 classB 在 classA 之后被释放,它会向已经解除分配的 classA 发送消息导致崩溃。

请记住,您不能始终保证 dealloc 顺序,特别是如果它们是自动释放的。

所以是的,在 classA 的 dealloc 中取消委托(delegate)属性。

关于objective-c - 您应该在使用委托(delegate)的类中还是在类本身中将委托(delegate)设置为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1071768/

相关文章:

objective-c - 如何让 rand() 更有可能选择某些数字?

c - 空指针取消引用未初始化的内存是否属于内存损坏

ios - NSUrlConnection 委托(delegate)方法未从辅助类调用

iphone - ALAssetsLibrary 获取视频路径稍后播放

ios - 在 iOS 中使用 ffmpeg 进行 hls 直播

iphone - 使用AudioServicesAddSystemSoundCompletion传递参数

c - 动态分配 C 数组的大小不应该出错吗?

c++ - 对 C++ 内存释放感到困惑

c# - 如何分配 UIPopoverPresentationControllerDelegate

C# 委托(delegate)中动态链接变量值的问题