NSTimer의 올바른 폐기 자세

2070 단어

1. 해석

// 5 
- (void)method1{
 self.timer = [NSTimer scheduledTimerWithTimeInterval:5] target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void)dealloc{
[self.timer invalidate];// 
}


이 대상은 계수기를 가지고 있고, 시계수기도 대상을 가지고 있기 때문에 순환 인용을 초래한다.만약 순환 인용이 있다면 dealloc 방법은 영원히 호출되지 않고 계수기도 실행되지 않을 것입니다.단지 self.timer=nil, 해결할 수 없습니다

2. 솔루션


2.1 invalidate를 주동적으로 호출한다.
1. 보기 컨트롤러에서 보기 컨트롤러가 보기 컨트롤러 용기에서view Controller를 추가하거나 제거하면 이 방법은didMoveToParent View Controller로 조정됩니다.
- (void)didMoveToParentViewController:(UIViewController *)parent{
[self.timer invalidate];
}

2. 감청 컨트롤러를 통해 되돌아오는 버튼
-(id)init{
self = [super inti];
if(self){
self.navigationItem.backBarButtonItem.target = self;
self.navigationItem.backBarButtonItem.action = @selector(backView);
 }
}
- (void)backView{
[self.timer invalidate];
self.navigationColltroller popViewContrllerAnimated:YES];
}

2.2 invalidate를 호출하는 방법을 다른 종류에 넣는다.
타이머 기능은 CHViewController에서 CHTimerTool 타이머 도구 클래스를 분리하여 정의합니다.
@implemention CHTimerTool
-(void)initWithTimer:(NSTimeInterval)interval target:(id)target selector:(SEL)selector{
self= [super inti];
if(self){
self.target = target;
self.timer = [NSTimer scheduledTimerWithTimeInterval:5] target:self selector:@selector(update) userInfo:nil repeats:YES];
  }
} 
- (void)update{
// modelList
if([target respodnsToSelector:selector])
{
[target performSelector:selector withObject:modelList];
}

}


- (void)clearTimer{
[self.timer invalidate];
}

@end
@interface
@property (nonatomic, retain)CHTimerTool *chtool;
@end

@implemention CHViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
self.chtool = [CHTimerTool initWithTimer:30 target:self selector:@selector:(updateUI:)];
    
 }
 
 - (void)updateUI:(NSArray*)modelList{
 // UI
 }
 // , dealloc
 - (void)dealloc{
 [ self.chtool clearTimer]
 }

@end

좋은 웹페이지 즐겨찾기