如果您使用的类本身委托或委托设置为nil的类(Should you set the delegate

2019-06-24 17:01发布

如果类A是用B类和A是B类的代表,是确定的,如果委托设定为B类的dealloc的零? 我见过的代码通常重置代理,A级的的dealloc内零,但不知道真正的区别做一个或其他方式。

例如,这是通常的方式:

// somewhere in class A

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

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

Answer 1:

是的,你应该设置在CLASSA的dealloc中的CLASSB的委托属性设为零。

这不是一个内存管理问题,因为委托性质上应注明分配,不保留,以避免保留周期(否则的dealloc将永远不会被调用)。 问题是,否则CLASSB实力消息CLASSA它已被释放之后。

例如,如果CLASSB有delagate电话,说“被隐藏”,和ClassB只是CLASSA后释放,这将消息已经dealloc'ed CLASSA导致飞机坠毁。

请记住,你不能总是机制保障的dealloc顺序,特殊的,如果他们被自动释放。

所以,是的,无出CLASSA的dealloc的委托财产。



Answer 2:

据我所知,它的最佳实践(分配)的委托,这样就避免了保留计数就是这样的情况下,循环引用。 如果你已经设置了正确的属性,即:

@property (assign) id<BDelegate> delegate;

你不应该在dealloc中执行任何的内存管理,保留计数,当你调用self.b.delegate =自我是没碰到; - 与使用(保留)或(复印件)

合理? 这将是罚款,设置委托零,但什么意义呢?



Answer 3:

首先,一些看法...

  1. 你忘了打电话[super dealloc]在自己的dealloc方法结束。
  2. 因为“A”创建“B”,并且如果没有其它的目的都保留“B”,在nilling在委托有没有点-dealloc ,因为“B”是要被无论如何破坏。 如果它可能是其他物体有“B”的引用(这意味着它可能会活得比“A”),然后设置委托到零。
  3. 对象“B”应该是一个如果有必要照顾其委托的在自己的-dealloc。 (一般情况下,委托不保留委托。)
  4. 避免使用-init属性...和-dealloc方法 - 苹果不鼓励这种,有很好的理由。 (它不仅能有意想不到的副作用,但也可引起厉害,crashier问题。)
  5. (通过点语法),当你不需要使用属性来无形增加了额外的工作。 例如, self.b.delegate = self等同于[[self getB] setDelegate:self] -它只是语法糖,使得它看起来就像你直接访问伊娃,但你其实不是。
  6. 使用性能不理解他们做什么会导致麻烦。 如果self.b保留值(属性设置为“分配”),你有你的手内存泄漏。

以下是我可能会写:

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

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


文章来源: Should you set the delegate to nil in the class using the delegate or in the class itself