参考链接:https://www.jianshu.com/p/fdb1bc445266
1.含义
_cmd在Objective-C的方法中,表示当前方法的selector
比如,- (void)test {
NSLog(@"the selector is %@", NSStringFromSelector(_cmd));
}
//打印结果为 test
2.用法
2.1 打印当前被调用的方法
//比如需要打印当前被调用的方法,可以在一个方法中添加:
NSLog(@"%@ call",NSStringFromSelector(_cmd));
//会输出类似
//2013-01-10 11:25:46.902 TDDataViewer[855:303] applicationDidFinishLaunching: call
2.2
//在cocos2d中,_cmd通常用于定时调用某个函数(schedule)
//比如下面方法利用_cmd能够不定时地调用某个函数
-(void) scheduleUpdates {
// schedule the first update as usual
[self schedule:@selector(irregularUpdate:) interval:1];
}
-(void) irregularUpdate:(ccTime)delta {
// unschedule the method first [self unschedule:_cmd];
// I assume you’d have some kind of logic other than random to determine
// the next time the method should be called
float nextUpdate = CCRANDOM_0_1() * 10;
// then re-schedule it with the new interval using _cmd as the selector
[self schedule:_cmd interval:nextUpdate];
}
2.3 在runtime的时候,比如在某个分类方法里为对象动态添加属性,_cmd作为key
由于_cmd是在编译时候(compile-time)就已经确定的值,所以可以直接使用
通常写法:
staticcharkExtendVarKey;// 键名
-(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);
}
}
2.4
-(CustomNavigationControllerDelegate*)customDelegate{
returnobjc_getAssociatedObject(self,_cmd);
}
-(void)setCustomDelegate:(CustomNavigationControllerDelegate*)customDelegate{
objc_setAssociatedObject(self,@selector(customDelegate),customDelegate,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
网友评论