关于代表的问题

Jab*_*Jab 9 cocoa objective-c

这段代码非常简单,是否正确?我不知道是否应该保留通过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
Run Code Online (Sandbox Code Playgroud)

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

// 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?
Run Code Online (Sandbox Code Playgroud)

hbw*_*hbw 11

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

查看这些 文章,了解有关使用/实现代理的更多信息.

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

  • 根据具体情况,您的对象可能不会先被销毁,但至少会取消委托.(例如:UIAccelerometer) (2认同)