_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);
}