我认为这很简单,但我遇到了很大的问题。
我有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
完成了他们的工作并且必须被释放。我试过一些事情:
发送另一个代理邮件。但是,如果我在此委托中执行[barCode release];
,程序会崩溃,因为barCode对象仍在运行,需要转到下一条指令
我可以发送[self release]
,但我不知道它是否有用以及该程序将在其后的“中心”UIViewController
中进行。
我可以使用
关闭此辅助UIViewController
[self dismissModalViewControllerAnimated:NO];
但同样,该计划进入中心 UIViewController
。
有人有想法解决这个问题吗?
**编辑**
也许我找到了答案: 我不会像代理一样调用委托
[theDelegate BarCodeFinish];
但请通知他。
[[NSNotificationCenter defaultCenter] postNotificationName:@"BarCodeFinish" object:nil];
第一种情况我仍然会在调用之后运行下一个代码,但是在第二种情况下,调用将在完成它内部的函数后运行,并且我可以毫无问题地释放条形码对象。这是最好的方式吗?
答案 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];