延時時間的幾種方法

等我詳細寫,最近發現了一些問題

  • 方法1:performSelector
// 1.5s后自動調用self的hideHUD方法
//此方式要求必須在主線程中執行,否則無效。
[self performSelector:@selector(hideHUD) withObject:nil afterDelay:1.5];
  • 方法2:GCD
    這個可以在主線程執行,也可以在子線程執行, 計時最準確的。
    //此方式在可以在參數中選擇執行的線程。
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // 1.5s后自動執行這個block里面的代碼
    self.hud.alpha = 0.0;
});
  • 方法3:NSTimer
//inderval 是指的時間 userinfo 此參數可以為nil,當定時器失效時,由你指定的對象保留和釋放該定時器
//當YES時,定時器會不斷循環直至失效或被釋放,當NO時,定時器會循環發送一次就失效。
//__此方式要求必須在主線程中執行,否則無效。
    self.timermoney=[NSTimer scheduledTimerWithTimeInterval:12 target:self selector:@selector(timerFired:)  userInfo:nil repeats:true];
//——————這里要用到RUNLOOP的事情,這個方法已經加入主線程,所以直接加入ModelCom都滿足,
    [[NSRunLoop currentRunLoop]addTimer:self.timermoney forMode:NSDefaultRunLoopMode];
    //立即執行
    [self timerFired:self.timermoney];
    //觸發事件
-(void)timerFired:(NSTimer *)theTimer {
    //然后在需要結束的時候停止計時器 ,這個是唯一一個可以將計時器從runloop中移出的方法。
    [self.timermoney invalidate];


//2 通過消息轉發
    _target = [NSObject new];
    class_addMethod([_target class],@selector(fire), class_getMethodImplementation([self class], @selector(fire)), "v@:");
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:_target selector:@selector(fire) userInfo:nil repeats:YES];

//3 NSProxy 多重代理實現
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{
    
    return [self.target methodSignatureForSelector:sel];
}

- (void)forwardInvocation:(NSInvocation *)invocation{
    
    [invocation invokeWithTarget:_target];
    
}
    _fyProxy = [FYProxy alloc];
_fyProxy.target = self;
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:_fyProxy selector:@selector(fire) userInfo:nil repeats:YES];
    
    
}
  • 4.sleep方式 沒用過
//此方式在主線程和子線程中均可執行。是一種阻塞的執行方式,建方放到子線程中,以免卡住界面,
[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];

我沒有深入的研究這些延時方法對應的內存泄漏,在我的工作中這么用也沒有出現問題,請大牛指出錯誤

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Object C中創建線程的方法是什么?如果在主線程中執行代碼,方法是什么?如果想延時執行代碼、方法又是什么? 1...
    AlanGe閱讀 1,792評論 0 17
  • GCD簡介 GCD 是 libdispatch 的市場名稱,而 libdispatch 作為 Apple 的一個庫...
    獨木舟的木閱讀 1,292評論 0 5
  • 線程、進程 1.iOS中的多線程操作、多線程方式? 2.多線程的優點和缺點分別是什么? 答:優點:1、將耗時較長的...
    丶逐漸閱讀 1,406評論 0 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • 1.anomaly NOUN anomaly(in sth) a thing, situation, ...
    倦鳥歸矣閱讀 216評論 0 0