激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - IOS - iOS NSTimer循環(huán)引用的辦法

iOS NSTimer循環(huán)引用的辦法

2021-04-09 15:11LinXunFeng IOS

這篇文章主要介紹了iOS NSTimer循環(huán)引用的辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在當(dāng)前控制器(viewcontroller)的view上添加了一個自定義的view(lxftimerview), lxftimerview在成功創(chuàng)建出來后添加了定時器nstimer并加入runloop開始工作, 當(dāng)在當(dāng)前控制器里將lxftimerview移除掉后,定時器還在工作,而且lxftimerview里的dealloc并沒有調(diào)用

 

 

iOS NSTimer循環(huán)引用的辦法 代碼

lxftimerview.m

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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 {
  // 創(chuàng)建定時器
  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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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

引用關(guān)系

 

 
iOS NSTimer循環(huán)引用的辦法

 

問題就出在lxftimerview與nstimer之間,在創(chuàng)建定時器時執(zhí)行

?
1
[nstimer scheduledtimerwithtimeinterval: target: selector: userinfo: repeats:];

會將lxftimerview進(jìn)行強(qiáng)引用,什么?我怎么知道?看下圖

 

 
iOS NSTimer循環(huán)引用的辦法

 

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

解決方案

讓定時器指著另一個對象,讓那個對象來執(zhí)行l(wèi)xftimerview中需要執(zhí)行的方法。 引用關(guān)系如下圖所示

 

 
iOS NSTimer循環(huán)引用的辦法

 

創(chuàng)建一個繼承于nsobject的類 lxfweaktarget,并提供一個創(chuàng)建定時器的方法(蘋果官方的方法,對scheduledtimerwithtimeinterval進(jìn)行轉(zhuǎn)到定義操作【就是command+左鍵】就可以得到) lxfweaktarget.h

?
1
2
3
4
#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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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 {
  // 創(chuàng)建當(dāng)前類的對象
  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中導(dǎo)入lxfweaktarget的頭文件

?
1
#import "lxfweaktarget.h"

將創(chuàng)建定時器的類改為 lxfweaktarget

 

復(fù)制代碼 代碼如下:

self.timer = [lxfweaktarget scheduledtimerwithtimeinterval:1.0 target:self selector:@selector(log) userinfo:nil repeats:yes];

 

現(xiàn)在再來執(zhí)行一下程序

 

 

iOS NSTimer循環(huán)引用的辦法

最后縷下思路

  1. 我們用一個lxfweaktarget來替lxftimerview執(zhí)行一些操作。
  2. 當(dāng)沒有被定時器強(qiáng)引用的lxftimerview從父控件上被移除時,就會執(zhí)行dealloc方法,lxftimerview被銷毀。
  3. 將定時器作廢并設(shè)為nil,這樣定時器對lxfweaktarget的引用也沒有了,lxfweaktarget也會被銷毀。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://juejin.im/post/5a329003f265da4320034606

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美国一级毛片片aa久久综合 | 精品国产乱码久久久久久丨区2区 | 成人一级免费视频 | 欧美极品欧美精品欧美视频 | 91精品久久久久久久久久久 | 亚洲一区二区三区四区精品 | 成人免费视频视频在线观看 免费 | 欧美精品久久久久久久久老牛影院 | 精品国产一区二区三区久久久蜜 | 国产二区三区四区 | 久久国产精品网 | 成人在线视频一区 | 国产精品免费看 | av电影在线观看网址 | av国产在线被下药迷网站 | 久久久久久亚洲国产精品 | 久久精品一区二区三区国产主播 | 亚洲国产精品高潮呻吟久久 | 天天色综合2 | 久久久无码精品亚洲日韩按摩 | 美女网站色免费 | 一级免费毛片 | 国产视频在线免费观看 | 久久久久久久免费看 | 久在线观看| 九九热在线免费观看视频 | 5a级毛片| 色诱亚洲精品久久久久久 | 成人精品一区二区 | av在线看网站| 国产大片在线观看 | 久久人人爽人人爽人人片av高清 | 午夜国产精品成人 | 黄色片网站免费 | 一级爱爱| 韩国精品一区二区三区四区五区 | 九九黄色 | 久久久一二三 | 嗯~啊~弄嗯~啊h高潮视频 | 色七七网站 | 日本精品久久久久 |