2013-02-18 71 views
1

我读过你应该将委托人设置为无dealloc。我注意到它在init中这样做,这是好的,还是应该在dealloc中做同样的事情?目标C中无委托人

“这很微妙但很方便,如果你将自己作为委托传递给另一个对象,在你释放之前重置该对象的委托。

file.h

@interface TestService : NSObject 
{ 
    NSObject <TestServiceDelegate> *m_delegate; 
} 

@property (nonatomic, assign) NSObject <TestServiceDelegate> *delegate; 

file.m

@synthesize delegate=m_delegate; 

    - (id)init 
    { 
     if (self = [super init]) 
     {   
      m_delegate = nil; 
     } 

     return self; 
    } 

    - (void)dealloc 

    { 
     [super dealloc]; 
    } 
+0

为什么在init中这样做会让你无法在dealloc中执行它,如果哪一个甚至真的有必要? – 2013-02-18 16:59:25

+4

有些人喜欢在'init'中删除实例字段,作为一种“腰带和吊带”的东西,并用于文档目的。这是没有必要的,并且与之后在dealloc中做的事无关。 – 2013-02-18 16:59:51

回答

8

需要既不之一。

init方法的情况下,实例变量将从nil开始,所以没关系。

dealloc的情况下,您的委托实例变量(我猜在这里,但如果它是不是也应该!)设置为weak(ARC)或assign(非ARC)特性,一旦你释放对象不会将任何内容发送给委托人。

+2

如果您使用的是ARC,则不应将assign用于委派分配,它应该很弱。这会自动清理委托并将其设置为零而不释放阻止访问释放内存的地址。 ARC在同一时间很烦人而且很好。 – Holyprin 2013-02-18 19:31:00

+0

谢谢,更新了代码示例。 – pgb 2013-02-18 19:57:01

+0

现在我想知道为什么Apple代码使用委托引用的'assign'属性。 – user 2014-02-10 19:30:12

5

你加入这句话:“这是一个微妙的,但方便的一个。如果你传递自己作为一个代表到另一个对象,重置该对象的委托你的dealloc之前。”

这是指与您发布的代码完全不同的内容。该帖适用于以下例子:

Foo.m:

- (void)someFooMethod { 
    _someBariVar = [[Bar alloc] init]; 
    _someBariVar.delegate = self; 
} 

- (void)dealloc { // Foo's dealloc 
    _someBariVar.delegate = nil; 
    [_someBariVar release]; 

    [super dealloc]; 
} 

的这点只是柜面Bar对象是别人保留当Foo dealloc方法被调用。由于Foo实例消失了,但Bar实例不是,所以您不希望Bar实例仍然认为它具有有效的委托。