iOS中解決NSTimer迴圈引用的三種方式

2021-10-06 12:00:00 字數 2051 閱讀 3977

今天有個人來公司面試,問了他平時在使用timer定時器時怎麼解決迴圈引用的問題。

然後就得到了這樣乙個答案:

__weak typeof(self) weakself = self;

self.timer = [nstimer scheduledtimerwithtimeinterval:1.0 target:weakself selector:@selector(fire) userinfo:nil repeats:yes];

這種方式不能解決迴圈引用的原因是:在nstimer的內部會對當前的weakself引用計數+1

@property (nonatomic, strong, nullable) nsobject *target;

@property (nonatomic, strong, nullable) nstimer *timer;

使用nstimer提供的api,在block中執行定時任務

__weak typeof(self) weakself = self;

self.timer = [nstimer scheduledtimerwithtimeinterval:1 repeats:yes block:^(nstimer * _nonnull timer) ];

引用邏輯

self強引用timer弱引用target

引用邏輯

self強引用timer強引用target

_target = [[nsobject alloc] init];

class_addmethod([_target class], @selector(fire), class_getmethodimplementation([self class], @selector(fire)), "v@:");

self.timer = [nstimer scheduledtimerwithtimeinterval:1.0 target:_target selector:@selector(fire) userinfo:nil repeats:yes];

建立乙個整合自nsproxy的類phjproxy 宣告乙個target

#import #import @inte***ce phjproxy : nsproxy

@property (nonatomic, weak) id target;

@end

phjproxy的實現

@implementation phjproxy

// 傳送給target

- (void)forwardinvocation:(nsinvocation *)invocation

// 給target註冊乙個方法簽名

- (nullable nsmethodsignature *)methodsignatureforselector:(sel)sel

@end

phjproxy 和 nstimer的使用

self.proxy = [phjproxy alloc];

self.proxy.target = self;

self.timer = [nstimer scheduledtimerwithtimeinterval:1.0 target:self.proxy selector:@selector(fire) userinfo:nil repeats:yes];

引用邏輯

self強引用timer強引用proxy弱引用self

NSTimer中的迴圈引用

void viewdidload void p dosomething void p stopdosomething void dealloc 上面的 主要是利用定時器重複執行p dosomething方法,在合適的時候呼叫p stopdosomething方法使定時器失效.scheduledtim...

iOS中NSTimer的使用

我們在開發的過程中,可能會用到計時器,foundation框架中有個類叫做nstimer。我們可以指定絕對的日期與時間,也可以指定執行任務的相對延遲時間,還可以重複執行任務,下面我們來看一下nstimer的使用。計時器要和 執行迴圈 相關聯,執行迴圈到時候會觸發任務。建立nstimer時,可以將其 ...

IOS中定時器NSTimer

呼叫一次計時器方法 cpp view plain copy mytimer nstimer scheduledtimerwithtimeinterval 1.5 target self selector selector scrolltimer userinfo nil repeats no 不重複...