释放对象的方法是调用委托函数来释放自己

时间:2011-07-06 16:18:34

标签: objective-c cocoa-touch cocoa uiviewcontroller

我认为这很简单,但我遇到了很大的问题。

我有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;
}

然后启动并配置BarCode对象并使用

启动摄像机
[self presentModalViewController:barCodeView animated:YES];  

现在,一段时间后,我不得不解雇这个控制器

[barCodeView dismissModalViewControllerAnimated:YES];

我使用委托功能发送数据,现在这个UIViewController完成了他们的工作并且必须被释放。我试过一些事情:

  1. 发送另一个代理邮件。但是,如果我在此委托中执行[barCode release];,程序会崩溃,因为barCode对象仍在运行,需要转到下一条指令

  2. 我可以发送[self release],但我不知道它是否有用以及该程序将在其后的“中心”UIViewController中进行。

  3. 我可以使用

    关闭此辅助UIViewController
    [self dismissModalViewControllerAnimated:NO];
    

    但同样,该计划进入中心 UIViewController

  4. 有人有想法解决这个问题吗?

    **编辑**

    也许我找到了答案: 我不会像代理一样调用委托

    [theDelegate BarCodeFinish];
    

    但请通知他。

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

    第一种情况我仍然会在调用之后运行下一个代码,但是在第二种情况下,调用将在完成它内部的函数后运行,并且我可以毫无问题地释放条形码对象。这是最好的方式吗?

2 个答案:

答案 0 :(得分:1)

如果我理解控制你的程序的第二个视图控制器是modaly并且您正在寻找一种方法来解除视图控制器并释放条形码?

在我看来,这应该在委托方法中完成。例如:

-(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
}

一旦该方法返回,您的应用程序将在发送代码后等待下一个事件,可能是某些Internet提供的数据。

我使用NSUInteger作为参数,但您可以设置自己的类型。 希望这会有所帮助。

答案 1 :(得分:0)

为什么不自动释放?

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