簡體   English   中英

在dealloc方法中,需要將任何委托設置為nil

[英]In dealloc method set any delegate to nil is needed or not needed

我已經通過如下的程序化在視圖中創建了tableview

table = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, 320, 370) style:UITableViewCellStyleDefault];
table.delegate = self;
table.dataSource = self;
table.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:table]; 

在dealloc方法中我寫如下

table.delegate = nil;
 table.dataSource = nil;
[table release];
table=nil;

這是更好的方法或低於一個更好

[table release];
table=nil;

我想知道我是否不重置委托和dataSource會發生什么

Thanq

如果要取消分配充當其他對象的委托的對象,則需要確保在調用[super dealloc]之前將其委托設置為nil(假定對象不保留其委托的正常模式)。 這是因為當[super dealloc]返回時,該對象不再是有效對象,並且如果未將其設置為nil,則該對象將成為有效懸掛參數的委托。

在這種情況下,您可能會不做而離開,因為除非拆除UI且表視圖不再需要使用其委托或數據源,否則您的對象的dealloc可能不會被調用,但是不要打賭在上面。

在dealloc中將委托設置為nil

這是一種防御性的編程動作。 如果您告訴對象已使用完委托后,對象中的其他內容試圖訪問委托,則會清除對委托對象的引用。 作為您的dealloc的一部分,您可能有一個方法或執行某些操作來觸發KVO通知,該通知會調用該委托。 因此,將委托人的引用設置為nil可以防止這種情況的發生。 如果確實發生了,您可能會遇到一些奇怪的崩潰,很有趣,可以重制和修復。

要添加到上面的答案,您不需要

table = nil;

在你的dealloc中。 不會造成傷害,但是沒有必要消除您的錯誤。 您的視圖正在取消分配,因此您的ivars將不再可用。 您可能將其與:

self.table = nil;

如果您通過屬性訪問ivar,則可以用作釋放的另一種方法。

當然,如果您已打開ARC,則根本不需要該版本。

並回答您的實際問題,如果您不取消視圖的dealloc上的表的委托和數據源,則...什么都不會發生。 它們被設置為視圖,該視圖正在被釋放。 在這種情況下,您將不會有任何問題。 從理論上講,這是一種很好的形式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM