iOS NSTimer 순환 참조 방법
코드
LXFTimerView.m
#import "LXFTimerView.h"
@interface LXFTimerView()
/** */
@property(nonatomic, weak) NSTimer *timer;
@end
@implementation LXFTimerView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self addTimer];
}
return self;
}
- (void)dealloc {
NSLog(@"LXFTimerView - dealloc");
[self removeTimer];
}
#pragma mark -
/** */
- (void)addTimer {
//
if (self.timer) { return; }
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(log) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
/** */
- (void)removeTimer {
[self.timer invalidate];
self.timer = nil;
}
- (void)log {
NSLog(@" -- %s", __func__);
}
@end
ViewController.m
#import "ViewController.h"
#import "LXFTimerView.h"
@interface ViewController ()
/** timerView */
@property(nonatomic, weak) LXFTimerView *timerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
LXFTimerView *timerView = [[LXFTimerView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)];
timerView.backgroundColor = [UIColor orangeColor];
self.timerView = timerView;
[self.view addSubview:timerView];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.timerView removeFromSuperview];
}
@end
인용 관계문 제 는 LXFTimerView 와 NSTimer 사이 에서 타 이 머 를 만 들 때 실 행 됩 니 다.
[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];
LXFTimer View 를 강하 게 인용 합 니 다.뭐라고 요?내 가 어떻게 알 아?아래 그림 을 보다타이머 가 종 료 될 때 까지 target 에 대한 강 한 인용 을 유지 합 니 다.그런데 왜 LXFTimer View 의 timer 속성 은 weak 를 사용 합 니까?서 두 르 지 마 세 요.곧 나 올 겁 니 다~
해결 방안
타이머 가 다른 대상 을 가리 키 며 LXFTimerView 에서 실행 해 야 할 방법 을 실행 하도록 합 니 다.인용 관 계 는 아래 그림 과 같다.
NSObject 에 계승 할 클래스 LXFWeak Target 을 만 들 고 타 이 머 를 만 드 는 방법 을 제공 합 니 다.
#import <Foundation/Foundation.h>
@interface LXFWeakTarget : NSObject
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
@end
#import "LXFWeakTarget.h"
@interface LXFWeakTarget()
@property(nonatomic, weak) id target;
@property(nonatomic, assign) SEL selector;
@end
@implementation LXFWeakTarget
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo {
//
LXFWeakTarget *object = [[LXFWeakTarget alloc] init];
object.target = aTarget;
object.selector = aSelector;
return [NSTimer scheduledTimerWithTimeInterval:ti target:object selector:@selector(execute:) userInfo:userInfo repeats:yesOrNo];
}
- (void)execute:(id)obj {
[self.target performSelector:self.selector withObject:obj];
}
@end
LXFTimerView.m 에서 LXFWeak Target 의 헤더 파일 가 져 오기
#import "LXFWeakTarget.h"
타이머 생 성 클래스 를 LXFWeak Target 으로 변경 합 니 다.
self.timer = [LXFWeakTarget scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(log) userInfo:nil repeats:YES];
이제 프로그램 을 다시 실행 해 보도 록 하 겠 습 니 다.마지막 으로 사고의 방향 을 상세히 밝히다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.