iOS 메모리 화제: NSTimer 로 인해 dealloc 를 처리 할 수 없습니다.

1611 단어 iOS
계 블 로그 iOS 메모리 화제: performSelector 로 인해 즉시 dealloc 를 사용 하지 않 습 니 다. 오늘 NSTimer 로 인해 메모리 가 풀 리 지 않 는 문 제 를 토론 하 겠 습 니 다.
직접 예 를 들다.
예 다운로드 주소:http://download.csdn.net/detail/androidbluetooth/9486863
ViewController 에서 다른 ViewController (LoginPage) 를 엽 니 다.
LoginPage.m
#import "LoginPage.h"

@interface LoginPage ()

@property (strong, nonatomic) IBOutlet UILabel *counterLabel;

@property (strong, nonatomic) NSTimer *timer;

@property (assign, nonatomic) int counter;

- (void)goLogin;

@end

@implementation LoginPage

- (void)dealloc
{
    NSLog(@"LoginPage: dealloc");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _counter = 0;
    
    _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
                                            selector:@selector(goLogin)
                                            userInfo:nil repeats:YES];
}

- (void)goLogin
{
    NSLog(@"LoginPage: goLogin.");
    
    self.counter ++;
    
    self.counterLabel.text = [NSString stringWithFormat:@"%i", self.counter];
}

@end

코드 는 이해 하기 쉽다.
NSTimer 는 1s 마다 goLogin 방법 을 실행 합 니 다.
LoginPage 가 닫 혔 을 때 dealloc 방법 을 사용 하 기 를 바 랍 니 다.
결과, 호출 되 지 않 았 습 니 다.
해결 방법, 다음 방법 을 추가 합 니 다.
- (void)viewDidDisappear:(BOOL)animated
{
    if (nil != _timer) {
        [_timer invalidate];
        _timer = nil;
    }
}

여기까지 오 면 쉽게 발견 할 수 있 는 문제 라 고 생각 할 지도 모른다.
경험 이 있 는 iOS 개발 자 에 게 이것 은 확실히 큰 문제 가 아니다.
그러나 코드 의 양 이 많아 서 문 제 를 제거 할 때 이 문제 의 존 재 를 반드시 알 아차 리 지 못 할 것 이다.
서로 격려 하 다.

좋은 웹페이지 즐겨찾기