关于代表的问题

时间:2009-04-18 21:42:00

标签: objective-c cocoa

这段代码非常简单,是否正确?我不知道是否应该保留通过init方法传入的委托。

@interface SomeClass : NSObject {
    SomeClassDelegate *someClassDelegate;
}
-(id)initWithDelegate:(SomeClassDelegate *)delegate;
@end

@implementation SomeClass
-(id)initWithDelegate:(SomeClassDelegate *)delegate
{
    [delegate retain]; // should I be doing this?
    someClassDelegate = delegate;
}
-(void)dealloc
{
    [delegate release]; // obviously only do  this if I DO need to retain it
    [super dealloc];
}
@end

我最初的想法是否定的,但是这段代码似乎暗示了其他方面。我知道我不能依赖保留计数,但我想知道处理代表的正确方法。

// self's retain count is 1
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self];
// the retain count is now 2, did the init of URLConnection retain self?

2 个答案:

答案 0 :(得分:11)

不,一般来说,你不应该保留代表。由于委托已经具有对象的引用,因此如果保留委托,则基本上将创建循环引用。此外,出于同样的原因,您可以假设在委托被销毁之前您的对象将被销毁。

查看these articles,了解有关使用/实施代表的更多信息。

编辑:有一些例外,其他人已经指出过。

答案 1 :(得分:1)

正如htw所说,你通常不应该保留代表。在多线程环境中,您经常需要保留所需的一切,即使只是方法调用的持续时间,也要确保它不会在您的背后失效。例如,如果(实际上并非如此),-[NSURLConnection initWithRequest:delegate]创建了一个线程可能保留(然后可能会自动释放)其参数的新线程。实际上,NSURLConnection是一种特殊情况,因为它在连接期间保留其委托。