2011-07-06 87 views
1

我認爲這很簡單,但我遇到了很大的問題。如何釋放一個對象正在調用委託函數釋放自己

我有2 UIViewController,其中一個是「中央」控制器和其他是用於攝像頭解碼條碼。

中央UIViewController,我打電話運行條碼:

barCode = [[MyBarCode alloc] init] 
    [barCode openBarCodeReader]; 
    //[barCode release]; //can't release it here, this cause problem with camera 
} //function finish 

MyBarCode對象將採取程序的控制。首先,它創建一個簡單的視圖的UIViewController

- (void) loadView { 
    UIView *frame = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [frame setBackgroundColor:[UIColor clearColor]]; 
    self.view = frame; 
} 

不是啓動和配置條形碼的對象,並用

[self presentModalViewController:barCodeView animated:YES]; 

啓動相機現在,一段時間後,我已經解僱該控制器

[barCodeView dismissModalViewControllerAnimated:YES]; 

我用代理功能發送數據,現在這個UIViewController完成他們的工作,必須被釋放。我試過一些:

  1. 發送另一個委託消息。但是,如果我在此代表,程序崩潰做[barCode release];,因爲條碼對象仍在運行,需要進入下一指令

  2. 我可以發送[self release]但我不知道它是否工作,並在程序之後會在「中央」UIViewController去。

  3. 我可以關閉此AUX UIViewController

    [self dismissModalViewControllerAnimated:NO]; 
    

    但同樣,當程序在中央UIViewController去。

有人有想法解決這個問題嗎?

**編輯**

也許我找到了答案: 我不會打電話委託等的方法

[theDelegate BarCodeFinish]; 

但隨着通知調用它。

[[NSNotificationCenter defaultCenter] postNotificationName:@"BarCodeFinish" object:nil]; 

拳頭情況下,我仍然會運行調用之後的下一個代碼,但在第二,呼叫將運行它完成它裏面的功能之後,我也沒有問題釋放條碼對象。這是最好的方法嗎?

回答

1

如果我明白了第二個視圖控制器,它可以控制您的程序,並且您正在尋找一種方法來解除視圖控制器並釋放條形碼?

在我看來,這應該在委託方法中完成。例如:

-(void)barCodeReader:(UIViewController *)aViewController didReadBarCode:(NSUInteger)theBarCode; 

在第一個視圖控制器中寫入該方法,然後將其設置爲第二個視圖的委託。 您甚至可以更好地編寫自己的協議......但是,一旦第二個視圖控制器讀取了條形碼,就會調用您的自定義方法。 方式,可以實現它應該是:

-(void)barCodeReader:(UIViewController *)aViewController 
     didReadBarCode:(NSUInteger)theBarCode { 
    // stop the bar code reader 
    [barCode release]; 
    // dismiss the second view controller 
    // do something with theBarCode 
} 

一旦方法返回,您的應用程序將等待下一個事件,可能是一些互聯網提供的數據,發送代碼之後。

我使用NSUInteger作爲參數,但您可以設置您自己的類型。 希望這有助於。

+0

嗡嗡聲..也許我寫了一個錯誤。它看起來像一個C函數。我想要做的只是簡單的:'result = [barCode openBarCodeReader]'然後'[條形碼發佈]'。我不能這樣做,因爲它會打開相機(並且我無法釋放條形碼,因爲它在打開相機之前先到達此行)。當相機解碼某些東西時,它會向條碼對象發送一個功能。現在我想將它返回到中央視圖(或中央對象,是相同的)。我使用委託來發送這些數據。 「中央」可以繼續。但我必須發佈條形碼。如果我發佈條形碼,它會轉到下一行,它會崩潰 – Rodrigo

+0

我想我找到了解決方案。我可以發送'[[NSNotificationCenter defaultCenter] postNotificationName:@「BarCodeFinish」object:nil];'。這將運行在對象之外,我可以釋放它。我不喜歡使用這種GOTO風格......但是,謝謝你的時間。 – Rodrigo

+0

Rodrigo,是不是MyBarCode一種條形碼包裝類?或者它是一個自定義的UIViewController子類? 不是第二個視圖控制器應該管理攝像機,而中央控制器管理第二個視圖控制器並等待其解碼某些東西。代理設計模式通常用於這種情況。如果'MyBarCode'是一個包裝類,*不*讓它設置相機,捕獲代碼......如果不是,你的'openBarCodeReader'應該做什麼? – 2011-07-06 19:59:11

0

爲什麼不只是autorelease?

barCode = [[[MyBarCode alloc] init] autorelease]; 
+0

我想我不明白很多的autorelease。它只用於函數變量嗎?我的問題總是:什麼時候會被釋放。我認爲是在函數結束之後,在這種情況下我需要另一個函數。 – Rodrigo

+0

沒有它的功能後不立即。自動釋放將在不再使用時釋放該對象。看看這個http://stackoverflow.com/questions/3439884/when-is-the-autorelease-pool-triggered/3442414#3442414 – domino