首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dealloc未被调用

Dealloc未被调用
EN

Stack Overflow用户
提问于 2012-04-12 00:47:56
回答 1查看 1.7K关注 0票数 2

我有一个视图控制器,其中有两种方法可以返回。

第一个场景如下:

RecordVC ->告诉Delegate dismissRecordVC:-> RecordVC被解雇并解除分配

第二个场景是这样的:

RecordVC ->告诉Delegate dismissAndShowVideosForRecordVC:-> RecordVC被解雇,VideosTVC提交了,但 RecordVC并没有被取消分配。

第一个场景是这样触发的:

代码语言:javascript
复制
- (IBAction)back:(id)sender {
    if ([_chromaKeySessionManager isWriting]) {
        [_chromaKeySessionManager cancelWriting];
    }
    [_chromaKeySessionManager stopRunning];
    [delegate dismissRecordVC:self];
}

委托方法dismissRecordVC:是这样的:

代码语言:javascript
复制
- (void)dismissRecordVC:(RecordVC *)vc {
    [self dismissModalViewControllerAnimated:YES];
}

如果使用这个back:方法,那么RecordVC就会很好地被释放。

第二个场景是这样触发的:

代码语言:javascript
复制
- (IBAction)goToVideos {
    if ([_chromaKeySessionManager isWriting]) {
        [_chromaKeySessionManager cancelWriting];
    }
    [_chromaKeySessionManager stopRunning];
    [delegate dismissAndShowVideosForRecordVC:self];
}

和委托的dismissAndShowVideosForRecordVC:方法:

代码语言:javascript
复制
- (void)dismissAndShowVideosForRecordVC:(RecordVC *)vc {
    [self dismissViewControllerAnimated:YES completion:^{
        VideosTVC *vc = [[VideosTVC alloc] init];
        [[self navigationController] pushViewController:vc animated:YES];
        [vc release];    
    }];
}

因此,在这种情况下,RecordVC从未被释放。这里唯一的区别是,我用一个完成块来取消它,然后推另一个控制器。

在我看来,这两种场景看起来完全一样(就保留/释放而言),除了在第一种情况下,RecordVC get被解除分配,而在后一种场景中,它从未被解除分配。奇怪,我知道我不该这么说,但好像是内部泄密。

在使用完成块进行解雇时,我是否保留了一些我不知道的东西?谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-04-12 01:18:47

一个不同之处是,完成块引用self。这导致它至少被保留,直到块起火。无可否认,在那之后,它应该被释放。

尝试在块外部创建一个本地以保存[self navigationController],然后在块中使用该本地,这样就没有对self的引用。

我还将指出,在-dismissAndShowVideosForRecordVC:中,您有一个参数和一个同名的本地。应该不重要,但也许有一个编译器错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10115976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档