美文网首页
iOS Objective-C 中 _cmd的用法

iOS Objective-C 中 _cmd的用法

作者: 棒棒德 | 来源:发表于2019-11-28 11:06 被阅读0次

参考链接: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);

}

相关文章

网友评论

      本文标题:iOS Objective-C 中 _cmd的用法

      本文链接:https://www.haomeiwen.com/subject/spwvwctx.html