为啥我的 ViewController 在第二次调用后才发布,iOS ARC?

Posted

技术标签:

【中文标题】为啥我的 ViewController 在第二次调用后才发布,iOS ARC?【英文标题】:Why my ViewController releases after second call only, iOS ARC?为什么我的 ViewController 在第二次调用后才发布,iOS ARC? 【发布时间】:2012-07-13 10:49:20 【问题描述】:

使用了 ARC。 我有一个简单的两个视图控制器,一个是启动视图控制器,第二个是自定义 UIImagepickerViewController(上面有几个自定义视图)

@interface ViewController : UIViewController  

@property (nonatomic, strong) CameraController *cameraController;




@implementation ViewController
@synthesize cameraController;
-(void) showCame 
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
   
    self.cameraController = [[CameraController alloc] init];
    self.cameraController.delegate = self;
    [self presentModalViewController:self.cameraController animated:YES];
   

但是当我这样做时 [selfdismissModalViewControllerAnimated:YES];在相机控制器中,它不会释放内存,只有当我第二次调用它时,它才会调用第一个实例的 dealloc 并创建第二个。

别忘了我用的是 ARC

编辑: 我只是用两个控制器创建了空白项目,用仪器(分配)运行它,在应用程序完全加载后我有 568Kb,然后我点击显示模态控制器并关闭它,我得到 642Kb(在第二个视图控制器中我放了 10 个对象IB) 问题是为什么?为什么这些数据没有完全销毁,可能是缓存还是一些?

【问题讨论】:

【参考方案1】:

即使您调用dismissModalViewControllerAnimated:,您仍然保留指向它的强指针。你必须设置你的指针 self.cameraController = nil; 告诉 ARC 你不再需要指向它的指针。

【讨论】:

谢谢,现在它正确调用了dealloc,但不释放内存 内存将在 ARC 决定时释放。它不一定会立即发生。只要您不保留任何其他指向它的指针,它就会消失。如果你有另一个指向它的指针,那么你可能仍然在泄漏内存。 我认为 ARC 在不再需要此源后立即发布它,我在其他代码中没有指针。 @user735924:如果内存没有被释放,那么你必须在某个地方有一个指向它的强指针,或者你有一个保留周期。例如,如果 CameraController 中的委托属性未声明为弱,则可能会发生保留循环。 Cameracontroller 是 UIImagePickerView,不知道弱不弱。

以上是关于为啥我的 ViewController 在第二次调用后才发布,iOS ARC?的主要内容,如果未能解决你的问题,请参考以下文章

为啥按钮只有在第二次点击后才起作用? (反应)

为啥 vue 在第一次编译时无法识别 TS 语法,但在第二次编译时可以正常工作?

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?

为啥 scanf (在 C 中)似乎只在第二次输入后才做出反应? [复制]

应用程序在第二次选择同一行时崩溃