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

首頁 > 系統 > iOS > 正文

iOS NSTimer循環引用的辦法

2020-07-26 02:35:18
字體:
來源:轉載
供稿:網友

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

代碼

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:];

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

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

解決方案

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

創建一個繼承于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];

現在再來執行一下程序

 

最后縷下思路

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线小视频| 国产美女主播一区| 欧美日韩精品中文字幕| 国产+人+亚洲| 欧美精品在线免费| 亚洲japanese制服美女| 亚洲视频axxx| 国产一区二区三区丝袜| 欧美精品制服第一页| 欧美黑人xxx| 日韩免费中文字幕| 97激碰免费视频| 欧美片一区二区三区| 国产精品观看在线亚洲人成网| 久久精品99无色码中文字幕| 国产精品视频一区国模私拍| 国产一区视频在线| 国产在线拍揄自揄视频不卡99| 欧美日韩在线视频观看| 欧美激情亚洲另类| 91日本在线视频| 欧美黄网免费在线观看| 久久亚洲精品中文字幕冲田杏梨| 欧美激情视频在线观看| 久久久久久久久久久国产| 国产精品视频1区| 91国产精品电影| 久久久精品国产网站| 国产精品久久77777| 精品国产乱码久久久久久婷婷| 亚洲国产成人精品久久| 91在线观看免费| 国产综合视频在线观看| 亚洲精品福利免费在线观看| 一区二区在线视频播放| 日韩精品极品毛片系列视频| 欧美肥婆姓交大片| 亚洲日本成人女熟在线观看| 亚洲人午夜精品免费| 亚洲精品小视频在线观看| 午夜精品一区二区三区在线视频| www.欧美免费| 日韩一区二区在线视频| www国产精品视频| 欧美成人免费大片| 欧美成人免费一级人片100| 美女精品视频一区| 91av在线精品| 日韩一区视频在线| 性色av一区二区三区在线观看| 2023亚洲男人天堂| 久久精品亚洲精品| www日韩中文字幕在线看| 国产成人精品一区二区三区| 中文字幕国产亚洲2019| 亚洲va欧美va在线观看| 欧美一级黑人aaaaaaa做受| 日韩精品在线观看视频| 97香蕉久久夜色精品国产| 国产精品99蜜臀久久不卡二区| 精品少妇一区二区30p| 亚洲大胆人体视频| 亚洲欧美色婷婷| 亚洲欧美国产精品久久久久久久| 精品国产一区二区三区久久狼黑人| 久久天堂av综合合色| 日韩精品免费在线视频观看| 精品一区二区亚洲| 亚洲精品视频在线播放| 狠狠躁18三区二区一区| 国产精品盗摄久久久| 欧美激情一二三| 精品magnet| 久久久久久中文字幕| 亚洲欧美一区二区三区在线| 九九热视频这里只有精品| 欧美激情视频一区二区| 欧美精品在线网站| 日韩国产精品视频| 国产午夜精品美女视频明星a级| 欧美激情精品久久久久久| 欧美日韩国产激情| 久久91超碰青草是什么| 成人免费网视频| 96精品久久久久中文字幕| 在线观看日韩av| 日韩欧美高清在线视频| 日韩免费观看视频| 国模叶桐国产精品一区| 中文字幕不卡av| 亚洲国产91色在线| 中文字幕亚洲一区二区三区五十路| 国产精品日韩欧美综合| 久久久91精品国产一区不卡| 国产精品成人免费视频| 777777777亚洲妇女| 久久精品国产成人精品| 欧美另类暴力丝袜| 亚洲在线免费视频| 国产视频久久久久久久| 国产日韩欧美自拍| 日本亚洲欧美三级| 97欧美精品一区二区三区| 欧美高清第一页| 亚洲图片欧洲图片av| 欧美亚州一区二区三区| 欧美一区二区三区艳史| 欧美在线xxx| 综合网日日天干夜夜久久| 日韩视频在线免费| 国产欧美中文字幕| 国产精品成av人在线视午夜片| 亚洲女人天堂av| 中文字幕在线观看亚洲| 久久久久五月天| 国内精品久久久久影院 日本资源| 欧美激情视频一区二区| 国产精品久久久久久久久久ktv| 国产ts人妖一区二区三区| 色悠久久久久综合先锋影音下载| 亚洲国产成人精品一区二区| 欧美不卡视频一区发布| 欧美日韩国产丝袜另类| 91亚洲精品久久久久久久久久久久| 亚洲无亚洲人成网站77777| 国产婷婷97碰碰久久人人蜜臀| 色系列之999| 久久影视电视剧凤归四时歌| 色先锋久久影院av| 欧美成人小视频| 久久福利视频导航| 57pao精品| 亚洲欧美日韩中文在线| 亚洲成人久久久| 日韩中文理论片| 色悠悠久久88| 国产精品久久久999| 亚洲女同性videos| 亚洲国产高清福利视频| 日韩精品亚洲视频| 日韩av色综合| 原创国产精品91| 成人欧美一区二区三区黑人孕妇| 国产精品91久久久| 亚洲性av网站| 国产精品美乳一区二区免费| 国产精品久久久久久久久久久久久| 国产中文字幕91| 成人亚洲激情网| 亚洲日本成人女熟在线观看| 国产欧美精品一区二区三区介绍| www.日本久久久久com.| 欧美久久精品午夜青青大伊人| 国产视频亚洲视频| 精品国产福利视频| 亚洲第一av网站| 日韩精品免费综合视频在线播放| 国内精品视频久久| 精品国产乱码久久久久久虫虫漫画| 亚洲一区二区中文字幕| 亚洲xxxx视频| 97久久超碰福利国产精品…| 欧美成人h版在线观看| 日韩视频免费在线|