2011-10-06 33 views
1

我會試着解釋這是最好的,可能的,如果我在這裏有這樣的代碼保持一類在後臺運行時,另一個已經開始

ViewTwoController *home = [[ViewTwoController alloc] initWithNibName:@"contentscreen" bundle:nil]; 
[self presentModalViewController:home animated:YES]; 
[home release]; 

我將開始一個新的.m和.h類。然而,我想要嘗試做的事情是,在調用這個命令時,讓.m和.h類在後臺運行,因此我不會丟失數據。

我能想到的最好的例子就是Android。如果你開始一個新的類,並且不在調用的類中添加finish()語句,那麼前一個類在當前類的後面運行(它被推到前面),並且保留它原來的所有數據,所以如果你點擊返回按鈕,你會看到你剛纔的信息。這可能嗎?如果人們不明白我想要做什麼,我可以嘗試添加更多細節。

回答

1

你需要更好地理解一個對象的生命週期。

一個對象通常帶有一個2部分過程。

  1. 分配 - (抓住該對象的存儲器,其成員)
  2. 初始化 - (設置對象以供使用)

這可以組合成與該+new類方法單一步驟它結合了allocinit

讓我們介紹一個名爲MyClass的示例類和一個名爲myObject的對象。按照慣例,類以大寫字母開頭,對象以小寫字母開頭。所以事不宜遲,一些代碼:

MyClass * myObject; 

這這使得一個對象指針,但不分配任何內存,或直接指針引用任何東西。

myObject = [[MyClass alloc] init]; 

這實際上創建的MyClass一個實例,傳遞-init消息給它,然後分配init消息到myObject返回值。此時此對象的引用計數爲1.

myObject可能超出範圍,但單獨不會釋放在alloc步驟期間分配的內存。

爲了釋放該內存,需要將釋放消息傳遞給該對象。

[myObject release]; 

釋放的作用是減少參考計數,如果該參考計數已經是1,那麼該對象將被傳遞的-dealloc表明它實際上是被釋放。

回到你的問題......本質上[self presentModalViewController:home animated:YES];結果在home結束呼籲-retain,以便它不會被破壞,直到你解散模態視圖控制器。在你調用release或者autorelease的時候,你不會釋放對象,只是告訴對象:
「嘿,我不再需要你了,如果沒有其他人做,然後釋放所有的內存你早點抓住「。

+0

乾杯。我正在閱讀更多的生命週期,正如我所說我是新的客觀C,起初並不容易,但是隨着我走,我得到了它的縈繞。你的評論很有啓發性,謝謝你,因爲它幫助我更多地理解語言。 –

0

您的問題與「在後臺運行的類」無關,但與您如何管理數據無關。

+0

你能詳細說明一下嗎?對不起,我對客觀的C –

0

當你展示一個模態視圖控制器時,它的父視圖(你展示它的視圖控制器)不會被銷燬(除非你明確地釋放它,這可能會在以後崩潰)。所以如果你想知道它是否還在記憶中,它是。至於仍在運行的任務,這取決於這些任務是什麼。例如,您仍然可以發送消息(調用方法),並且它會很樂意接收來自您的代理或來自代理的消息,並執行它在屏幕外的任何操作。

希望有幫助。

+0

Aye很新。但是,這裏是我面對的我有一個Web服務的URL在Web視圖中加載,如果我訪問另一個類,然後返回到原始類,URL超時(我們正在使用安全密鑰),所以如果我使用相同的密鑰兩次,它不會工作。所以我想要的是,當我回到原來的類時,它與我離開它完全一樣,類似於您在Android上可以做的。 –

+0

您是否需要繼續發送某種保持活動的消息來維持連接? – mjisrawi

+0

不是。我發送一個用戶名和密碼,一旦驗證完成,它會發回一個url,我可以在10秒內使用它,這很好,但顯然當我離開這個類並返回時,該URL已超時。我不希望每個班級都有兩個Web服務代碼,我想看看是否可以讓這個班級坐在新班級的後面並維護它的數據。那有意義嗎? –

0

在這種情況下,你正在呈現新的視圖控制器。主線程將出現在新控制器中。如果你想在前一個視圖控制器中的背景中運行某些東西,那麼你可以創建一個後臺線程。這可以使用[self perfomselectorInThebackground ...]或其他一些方法,如GCD。 (主要是你不應該阻塞主線程)

+0

settings * set = [[settings settings] initWithNibName:@「settings」bundle:nil]; \t [self performSelectorInBackground:YES withObject:set]; [set release]; 我可以這樣做嗎? –

相關問題