iOS中的_cmd


_cmd 是隱藏的參數,表示當前方法的selector,他和self表示當前方法調用的對象實例。

1、獲取當前被調用方法: NSStringFromSelector(_cmd) 

2、在運行時時使用:在某個分類方法里為對象動態添加屬性,由於_cmd是在編譯時候(compile - time)就可以確定的值,因此可以直接使用

  由於objc_getAssociatedObject 和 objc_setAssociatedObject 第二個參數需要傳入一個屬性的鍵名,是 const void * 類型的,通常的做法是

  

  static char kExtendVarKey; // 鍵名
  - (void)someCategoryMethod {
       NSString *extendVar = objc_getAssociatedObject(self, &kExtendVarKey);
       if(!extendVar){ extendVar = @"someText";
       objc_setAssociatedObject(self, &kExtendVarKey, extendVar, OBJC_ASSOCIATION_COPY_NONATOMIC);
       }
  }
 
    使用_cmd可以直接使用該@selector的名稱,即someCategoryMethod,並且能保證改名稱不重復
  - ( void)someCategoryMethod {
      NSString *extendVar = objc_getAssociatedObject(self, _cmd);
      if(!extendVar){
        extendVar = @"someText";
        objc_setAssociatedObject(self, _cmd, extendVar, OBJC_ASSOCIATION_COPY_NONATOMIC);
       }
  }
  
  還有一種是在運行時添加屬性,調用getter方法時使用
  
  - (CustomNavigationControllerDelegate *)customDelegate {
     return objc_getAssociatedObject(self, _cmd);
   }
  - (void)setCustomDelegate:(CustomNavigationControllerDelegate *)customDelegate {
    objc_setAssociatedObject(self, @selector(customDelegate), customDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  }
 
  
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM