亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS NSTimer循環引用的辦法

2019-10-21 18:43:00
字體:
來源:轉載
供稿:網友

在當前控制器(ViewController)的view上添加了一個自定義的view(LXFTimerView), LXFTimerView在成功創建出來后添加了定時器NSTimer并加入RunLoop開始工作, 當在當前控制器里將LXFTimerView移除掉后,定時器還在工作,而且LXFTimerView里的dealloc并沒有調用

 

 

iOS,NSTimer循環引用,循環引用,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

引用關系

 

 
iOS,NSTimer循環引用,循環引用,nstimer

 

問題就出在LXFTimerView與NSTimer之間,在創建定時器時執行

[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

會將LXFTimerView進行強引用,什么?我怎么知道?看下圖

 

 
iOS,NSTimer循環引用,循環引用,nstimer

 

翻譯:定時器保持著對target的強引用,直到定時器作廢 那為什么LXFTimerView中的timer屬性要用weak?? 不用著急,下面即將揭曉~

解決方案

讓定時器指著另一個對象,讓那個對象來執行LXFTimerView中需要執行的方法。 引用關系如下圖所示

 

 
iOS,NSTimer循環引用,循環引用,nstimer

 

創建一個繼承于NSObject的類 LXFWeakTarget,并提供一個創建定時器的方法(蘋果官方的方法,對scheduledTimerWithTimeInterval進行轉到定義操作【就是command+左鍵】就可以得到) LXFWeakTarget.h

#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中導入LXFWeakTarget的頭文件

#import "LXFWeakTarget.h"

將創建定時器的類改為 LXFWeakTarget

 

復制代碼 代碼如下:

self.timer = [LXFWeakTarget scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(log) userInfo:nil repeats:YES];

 

現在再來執行一下程序

 

 

iOS,NSTimer循環引用,循環引用,nstimer

最后縷下思路

  1. 我們用一個LXFWeakTarget來替LXFTimerView執行一些操作。
  2. 當沒有被定時器強引用的LXFTimerView從父控件上被移除時,就會執行dealloc方法,LXFTimerView被銷毀。
  3. 將定時器作廢并設為nil,這樣定時器對LXFWeakTarget的引用也沒有了,LXFWeakTarget也會被銷毀。

好,那“為什么LXFTimerView中的timer屬性要用weak”這個問題就不用多加解析了吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠久久亚洲欧美专区| 午夜精品美女自拍福到在线| 久久91亚洲精品中文字幕奶水| 国产精品第一页在线| 久久精品国产精品| 国产亚洲激情视频在线| 久热99视频在线观看| 综合网日日天干夜夜久久| 欧美主播福利视频| 欧洲日本亚洲国产区| 亚洲免费成人av电影| 欧美大片免费观看在线观看网站推荐| 国产一区二区丝袜| 亚洲美女动态图120秒| 亚洲高清不卡av| 日韩一区二区精品视频| 久久久国产一区二区| 久久免费国产视频| 亚洲精品成人免费| 久久91亚洲精品中文字幕奶水| 久久久免费精品视频| 久热在线中文字幕色999舞| 欧美一区二区三区图| 亚洲国语精品自产拍在线观看| 国产精品久久久久91| 欧美午夜视频一区二区| 日韩av网址在线| 97超级碰碰人国产在线观看| 国产精品女主播视频| 精品久久久精品| 精品久久久久久久久久久久久| 3344国产精品免费看| 亚洲激情电影中文字幕| 国产丝袜精品第一页| 亚洲午夜av电影| 国产91精品青草社区| 色婷婷久久av| 久久久91精品| 成人精品福利视频| 中文字幕成人精品久久不卡| 91wwwcom在线观看| 国产区亚洲区欧美区| 国产美女精品免费电影| 91精品国产777在线观看| 国产精品免费久久久| 国产午夜精品理论片a级探花| 性欧美办公室18xxxxhd| 国产成人免费av电影| 黄色成人av在线| 久久国产精品久久国产精品| 亚洲一区美女视频在线观看免费| 色综合男人天堂| 国产精品美女无圣光视频| 国产69精品久久久久9999| 国a精品视频大全| 国产欧美日韩专区发布| 日韩在线免费av| 91免费看视频.| 97超碰国产精品女人人人爽| 国产亚洲精品美女久久久| 一本色道久久综合狠狠躁篇的优点| 国产精品偷伦一区二区| 狠狠干狠狠久久| 国产成人av在线| 尤物yw午夜国产精品视频| 亚洲第一精品久久忘忧草社区| 26uuu日韩精品一区二区| 性欧美xxxx| 欧美性猛交xxxx免费看| 国产精品一区二区三区成人| 日韩视频一区在线| 日韩美女视频在线观看| 日韩乱码在线视频| 亚洲sss综合天堂久久| 久久久精品欧美| 欧美精品午夜视频| 日韩性xxxx爱| 在线看日韩av| 亚洲色图美腿丝袜| 亚洲男人av电影| 久久久久国产精品免费| 中文字幕国产亚洲2019| 中文字幕日韩有码| 欧美成人一区二区三区电影| 日韩精品999| 欧洲美女7788成人免费视频| 久久成人18免费网站| 欧美三级欧美成人高清www| 日韩成人激情视频| 国产成人久久久| 国产专区欧美专区| 91社影院在线观看| 88国产精品欧美一区二区三区| 国产精品久久久久久超碰| 精品免费在线观看| 国产男女猛烈无遮挡91| 俺去了亚洲欧美日韩| 国产亚洲一区精品| 国产成人av网址| 狠狠综合久久av一区二区小说| 久青草国产97香蕉在线视频| 5252色成人免费视频| 成人性生交xxxxx网站| 亚洲第一男人天堂| 亚洲乱码一区av黑人高潮| 国产精品爽黄69天堂a| 国产精品久久久久一区二区| 欧洲成人免费aa| 国产精品国产三级国产aⅴ浪潮| 国产精品入口日韩视频大尺度| 久久精品福利视频| 国产综合久久久久| 日韩精品免费在线播放| 久久久精品在线| 欧美野外wwwxxx| 欧美日韩亚洲网| 亚洲一区二区黄| 国产精品视频不卡| 国产精品视频成人| 亚洲激情国产精品| 一本色道久久88综合日韩精品| 91在线直播亚洲| 久久国产精品影视| 国产精品久久久久久av福利软件| 91视频国产精品| 2018国产精品视频| 精品国产一区av| 亚洲人成网站在线播| 亚洲经典中文字幕| 日日噜噜噜夜夜爽亚洲精品| 日韩久久午夜影院| 97碰在线观看| 国产精品毛片a∨一区二区三区|国| 欧美性xxxx18| 欧美黑人xxxx| 日韩av在线网址| 日韩精品视频观看| 不卡在线观看电视剧完整版| 欲色天天网综合久久| 亚洲自拍在线观看| 日韩中文字幕视频在线观看| 日韩免费电影在线观看| 亚洲精品有码在线| 国产精品黄视频| 97在线观看视频| 国产精品自拍网| 国产日韩欧美在线看| 久久好看免费视频| 欧美另类xxx| 久久精品国产96久久久香蕉| 欧美极品xxxx| 日韩高清有码在线| 亚洲精品丝袜日韩| 久久国产精品偷| 欧美成人一区二区三区电影| 国产日韩在线看| 日韩av在线最新| 成人黄色网免费| 亚洲在线一区二区| 69久久夜色精品国产69| 久久91精品国产91久久跳| 亚洲一区二区三区久久| 欧美精品免费在线观看| 国产精品免费电影|