NSTimer의 올바른 폐기 자세
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.