ios - 试图防止内存泄漏

标签 ios objective-c memory-leaks viewcontroller

我正在尝试做一些实验。

- (IBAction)btn1Action:(id)sender {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [self performSegueWithIdentifier:@"popvc2id" sender:self];
    });

    NSLog(@"TAP");
}

当点击按钮时,它需要 1 秒来执行 segue,当再次点击此按钮时,它将触发 segue 两次,因此将创建 ViewController 的两个实例。

在仪器中我可以看到两个实例,但其中一个是泄漏的 VC 对象

现在我要做的是

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    VC2 *vc2 = [segue destinationViewController];
    [ary addObject:vc2];
    if(ary.count > 1) {
        VC2 *vc = (VC2*)ary[1];
        vc = nil;
        [ary removeObjectAtIndex:1];
    }
    [ary removeAllObjects];
    NSLog(@"-> %@", vc2);
}

记录 VC objects 并尝试销毁第二个 obj,这样我就可以防止内存泄漏。

但它不起作用,我该如何解决?

最佳答案

如果您想取消之前的请求。我的建议是使用 NSObject CancelPreviousRequest 方法

如何实现:

- (IBAction)btn1Action:(id)sender { 
   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayedAction) object:nil];
   [self performSelector:@selector(delayedAction) withObject:nil afterDelay:1];
}

-(void)delayedAction{
  dispatch_async(dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:@"popvc2id" sender:self];
  });
}

关于ios - 试图防止内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40237345/

相关文章:

iphone - XCODE - 如何 : UIAlertView (with a text field) on a loop until correct value entered into field?

c++ - 内存管理和重新分配

objective-c - UISegmentedControl segment width of 设置背景图片时未设置

ios - OpenGL ES 2.0 纹理是透明的,但不显示后面的 OpenGL 内容

javascript - Sencha 触摸 : How to programmatically focus on a textfield on ios?

ios - 快速获取 iPhone 语言

ios - 可以延迟 segue 吗?

objective-c - UITableView:处理混合单元格 TableView 静态和动态单元格中的单元格选择

java - Spring for Android 内存问题

iphone - 将字符串提供给对象时泄漏字符串