2011-07-06 54 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