簡體   English   中英

當另一個班級開始時,讓班級在后台運行

[英]Keeping a class running in the background when another has been started

如果我在這里有這段代碼,我會盡力解釋一下

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

我將開始一個新的.m和.h類。 但是,我想嘗試做的是在調用此函數時,讓它在后台運行時調用.m和.h類,這樣我就不會丟失數據。

我能想到的最好的例子是Android。 如果您開始一個新的類,並且不在進行調用的類中添加finish()語句,則上一個類將在當前類后面(被推到最前面)運行,並維護它原來擁有的所有數據,因此,如果您按下返回按鈕,您將看到您剛才的信息。 這可能嗎? 如果人們無法理解我要做什么,我可以嘗試添加更多細節。

您需要更好地了解對象的生命周期。

一個對象通常通過兩部分過程來實現。

  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時,實際上並沒有取消分配對象,只是告訴對象:
“嘿,我不再需要您了,如果沒有其他人也不需要,那么可以釋放您之前抓取的所有內存。”

您的問題與“類在后台運行”無關,而與您如何管理數據有關。

當您提供模式視圖控制器時,其父級(從其提供視圖的視圖控制器)不會被破壞(除非您專門釋放它,否則稍后可能會使您的應用程序崩潰)。 因此,如果您想知道它是否仍在內存中; 它是。 至於仍在運行的任務,取決於這些任務是什么。 例如,您仍然可以向其發送消息(調用方法),它將很樂意從您或委托中接收這些消息,並在屏幕外執行所需的任何操作。

希望能有所幫助。

在這種情況下,您需要提供新的視圖控制器。 主線程將在顯示的新控制器中。 如果您希望某些內容在先前的視圖控制器中在后台運行,則可以創建一個后台線程。 可以使用[self perfomselectorInThebackground ...]或其他一些方法(例如GCD)來完成。 (主要是您不應該阻止主線程)

暫無
暫無

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

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