代码之家  ›  专栏  ›  技术社区  ›  Jab

关于代表的问题

  •  9
  • Jab  · 技术社区  · 16 年前

    这段代码很简单,对吗?我不知道我是否应该保留通过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 回复  |  直到 16 年前
        1
  •  11
  •   hbw    16 年前

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

    these articles 有关使用/实现委托的更多信息。

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

        2
  •  1
  •   Barry Wark    16 年前

    -[NSURLConnection initWithRequest:delegate] NSURLConnection 是一种特殊情况,因为它在连接期间保留其代理。