2016-10-25 1 views
0

몇 가지 실험을하려고합니다. 메모리 누출을 막으려고 시도합니다.

- (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 때이 다시 두번 SEGUE를 트리거 탭 버튼 때문에 ViewController 두 인스턴스가 생성 될을 수행하는 1 초가 걸릴 것이다 탭

.

악기에서 나는 두 개의 인스턴스를 볼 수 있지만 그 중 하나는 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를 파괴하려고, 그래서 메모리 누수를 방지 할 수 있습니다 것입니다.

하지만 작동하지 않는데 어떻게 해결할 수 있습니까? 메모리에 의해 쓴

+0

사용 부울 FLAG : 나의 제안 NSObject CancelPreviousRequest 방법을 구현하는 방법을

을 사용하고 있습니다. 문제가 두 번 탭을 수행하지 않도록 dispatch_after – AleyRobotics

+0

이후에 신고하기 전에 플래그를 확인하십시오. – Joshua

+0

로컬 변수를'nil'으로 설정하면 ** 일반적으로 메모리에서 제거하지 않습니다 **. iOS/ARC가 객체를 강제로 해제 할 수 없습니다. – clemens

답변

1

를 컴파일 오류가있을 수 있습니다. 두 번째 탭을 방지하기 위해

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

, 당신이 당신의 이전 요청을 취소하려면 여기

+0

사용자는 실제로이 두 번 탭을 수행하고 segue가 동작을 활성화하도록 할 수 있습니다. – Joshua

+0

@ Joshua이 기능을 삭제하셨습니까? - (void) prepareForSegue : (UIStoryboardSegue *) segue 보낸 사람 : (id) 보낸 사람 {...} 더 이상 필요하지 않습니다. – AleyRobotics

+0

오, 죄송합니다. 코드를 잘못 읽었습니다. – Joshua

관련 문제