美文网首页
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