今天有個人來公司面試,問了他平時在使用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 不重複...