2012-10-05 76 views
0

我正在一個項目中執行延遲加載的圖像。當imagedownloader下載圖像時,它會將消息發送給其委託來處理圖像。但是,當它的代表(它是一個視圖控制器)從內存中取消分配時,我不希望imagedownloader類將消息發送到它的代理,因爲它已經死了。我需要知道我什麼時候可以將imagedownloader的委託設置爲零?我的目標是設置爲iOS4.0,所以我不能使用弱引用。我有很多imagedownloader實例存儲在字典中,準備發送他們的委託完成消息。我必須設置所有這些存儲的實例來nil.For的delegte我現在做 '代表沒有得到零

-(void)viewWillDisappear:(BOOL)animated 
{ 
    for(imagedownloader *imagedownloaderObj in dict) 
    { 
     imagedownloaderObj.delegate = nil; 
    } 

    [super viewWillDisAppear:animated] 
} 

,但它在循環崩潰。請幫助任何人......並對我的壞英語感到抱歉,但我希望你明白了我的問題。

+0

顯示什麼錯誤? –

+0

thnks for editing and the error is Terminating app due to uncaught exception'NSInvalidArgumentException',reason:' - [__ NSCFString setModal:]:無法識別的選擇器發送到實例0x686e030' –

+0

實際上在這個for循環,它顯示相同的錯誤,如果我嘗試訪問在imagedownloader類中聲明的任何屬性。 –

回答

1

你的代碼有問題 - 你正在枚舉一個枚舉其鍵的字典,而不是它的對象。相反,你想這樣做:

for(ImageDownloader *imageDownloader in [imageDownloaderDictionary allValues]) 
{ 
    if (imageDownloader.delegate == self) 
     imageDownloader.delegate = nil; 
} //note - I've adjusted naming to match Objective-C style conventions. It fits in better with the framework code now. 

另外,我會說這樣做在dealloc而不是。我不知道在釋放之前你總是會得到一個viewWillDisappear:的方法,在iOS的早期版本(包括iOS4)上,你當然不能保證。此外,如果你回到那個視圖,你不想浪費時間再次下載圖像。

+0

我無法使用dealloc我正在使用ARC。有沒有其他的地方可以讓我們把代表設置爲零?並感謝你的回答,我會嘗試你的代碼並告訴你它是否工作。 –

+0

你也可以重寫dealloc!這正是你想在ARC的dealloc方法中做的事情。只是不要在那裏叫'超級'。 –

+0

是的,謝謝alottt卡爾你救了我的一天。它的工作現在完全正常了......我終於開始想讓代理人的財產強大,但你救了我去反對內存管理規則:) :) ..非常感謝 –