如果类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];
}
是的,你应该设置在CLASSA的dealloc中的CLASSB的委托属性设为零。
这不是一个内存管理问题,因为委托性质上应注明分配,不保留,以避免保留周期(否则的dealloc将永远不会被调用)。 问题是,否则CLASSB实力消息CLASSA它已被释放之后。
例如,如果CLASSB有delagate电话,说“被隐藏”,和ClassB只是CLASSA后释放,这将消息已经dealloc'ed CLASSA导致飞机坠毁。
请记住,你不能总是机制保障的dealloc顺序,特殊的,如果他们被自动释放。
所以,是的,无出CLASSA的dealloc的委托财产。
据我所知,它的最佳实践(分配)的委托,这样就避免了保留计数就是这样的情况下,循环引用。 如果你已经设置了正确的属性,即:
@property (assign) id<BDelegate> delegate;
你不应该在dealloc中执行任何的内存管理,保留计数,当你调用self.b.delegate =自我是没碰到; - 与使用(保留)或(复印件)
合理? 这将是罚款,设置委托零,但什么意义呢?
首先,一些看法...
- 你忘了打电话
[super dealloc]
在自己的dealloc方法结束。 - 因为“A”创建“B”,并且如果没有其它的目的都保留“B”,在nilling在委托有没有点
-dealloc
,因为“B”是要被无论如何破坏。 如果它可能是其他物体有“B”的引用(这意味着它可能会活得比“A”),然后设置委托到零。 - 对象“B”应该是一个如果有必要照顾其委托的在自己的-dealloc。 (一般情况下,委托不保留委托。)
- 避免使用-init属性...和-dealloc方法 - 苹果不鼓励这种,有很好的理由。 (它不仅能有意想不到的副作用,但也可引起厉害,crashier问题。)
- (通过点语法),当你不需要使用属性来无形增加了额外的工作。 例如,
self.b.delegate = self
等同于[[self getB] setDelegate:self]
-它只是语法糖,使得它看起来就像你直接访问伊娃,但你其实不是。 - 使用性能不理解他们做什么会导致麻烦。 如果
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