【问题标题】:Trying to prevent memory leak试图防止内存泄漏
【发布时间】:2016-10-25 10:19:42
【问题描述】:

我正在尝试做一些实验。

- (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");
}

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

在仪器中我可以看到两个实例,但其中一个是 leaked VC object

现在我想做的是

-(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,这样可以防止内存泄漏。

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

【问题讨论】:

  • 使用 bool FLAG 来防止第二次点击。在调用 dispatch_after 之前检查标志
  • 所以问题是没有执行两次点击?
  • 将局部变量设置为nil通常不会将其从内存中删除。您不能强制 iOS/ARC 释放对象。

标签: ios objective-c memory-leaks viewcontroller


【解决方案1】:

如果您想取消之前的请求。我的建议是使用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];
  });
}

【讨论】:

    【解决方案2】:
    - (IBAction)btn1Action:(id)sender {
            __block UIButton * btn = (UIButton*) sender;
    
            btn.enabled = NO;
    
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
                [self performSegueWithIdentifier:@"popvc2id" sender:self];
                btn.enabled = YES;
            });
    
    
            NSLog(@"TAP");
        }
    

    凭记忆写的,这里可能是编译错误

    【讨论】:

    • 用户仍然可以实际执行此双击并激活 segue 执行操作。
    • @Joshua 你删除了这个功能吗? -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {...} 你不再需要了
    猜你喜欢
    • 2010-09-21
    • 2015-02-05
    • 1970-01-01
    • 2016-07-10
    • 2010-12-20
    • 2011-12-05
    相关资源
    最近更新 更多