2013-02-18 67 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實例仍然認爲它具有有效的委託。