zoukankan      html  css  js  c++  java
  • Working with Methods

    1. method_invoke

    Note: way to eliminate compiler warnning

            . ENABLE_STRICT_OBJC_MSGSEND = NO; 

            . int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;

    Description:   Calls the implementation of a specified method.

    Declaration: id method_invoke(id receiver,Method m, ...) 

    Example:

    @interface KSModel4CheckMethod : NSObject
    
     + (void)classPrint;
     - (void)instancePrint;
     @end
    
     @implementation KSModel4CheckMethod
    
     #define PRINT_CMD NSLog(@"%@", NSStringFromSelector(_cmd))
    
     + (void)classPrint {
        PRINT_CMD;
    }
    
    - (void)instancePrint {
        PRINT_CMD;
    }
    @end
    
    #import <Foundation/Foundation.h>
    #import <objc/runtime.h>
    #import <objc/message.h>
    #import "KSModel4CheckMethod.h"
    
    void test_0_getName_NSString();
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            test_0_method_invoke();
        }
        return 0;
    }
    
    void test_0_method_invoke() {
    
        KSModel4CheckMethod *instance = [[KSModel4CheckMethod alloc] init];
        Class clazz = [KSModel4CheckMethod class];
        Method clazz_method = class_getClassMethod(clazz, @selector(classPrint));
        Method instance_method = class_getInstanceMethod(clazz, @selector(instancePrint));
    
    //    Method clazz_method = class_getClassMethod(clazz, @selector(instancePrint));
    //    Method instance_method = class_getInstanceMethod(clazz, @selector(classPrint));
    //    method_invoke(clazz, nil);
    //    method_invoke(instance, nil);
    
        method_invoke(clazz, clazz_method);
        method_invoke(clazz, instance_method);
        method_invoke(instance, clazz_method);
        method_invoke(instance, instance_method);
    }

    Result:

    1. method should be fetched from class

        class_getClassMethod(instance, @selector(instancePrint)) or 

        class_getInstanceMethod(instace, @selector(classPrint))  Return nil

    2. 2rd parameter with nil would lead to crash

        method_invoke(clazz, nil);

        method_invoke(instance, nil);

    3. 1rd parameter with instance or class  would produce same output

        method_invoke(clazz, clazz_method);

        method_invoke(clazz, instance_method);

        method_invoke(instance, clazz_method);

        method_invoke(instance, instance_method);

    Deepening:

    1.How do methods stored in logic and in physic 

     

  • 相关阅读:
    Python安装mysql-python错误提示python setup.py egg_info
    修改svn默认端口
    python pip下载速度慢的解决方法
    使用mysql自带工具mysqldump进行全库备份以及source命令恢复数据库
    pycharm 中自动补全代码提示前符号 p,m ,c,v, f 是什么意思
    Mysql按条件计数的几种方法
    linux shell 之if-------用if做判断
    在Centos7 上安装SVN
    Nginx配置文件详细说明
    设置文件上传的最大大小
  • 原文地址:https://www.cnblogs.com/hushuai-ios/p/5087465.html
Copyright © 2011-2022 走看看