IOS高级开发~Runtime(二)

本文详细介绍了如何使用 Objective-C 获取类的所有方法和属性,包括使用 class_copyMethodList 和 class_copyPropertyList 函数,以及如何通过反射机制获取属性名。并通过实例展示了如何获取全局变量值、设置全局变量值以及判断属性类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6、获取一个类的所有方法:

u_int count;

        Method * methods = class_copyMethodList([CustomClass class], &count);

        for (int i = 0; i < count; i++) {

            SEL name = method_getName(methods[i]);

            NSString * strName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];

            NSLog(@"%@",strName);

        }

 

运行结果:

2014-10-20 11:57:27.884 runtimetest[10939:303] fun1

2014-10-20 11:57:27.886 runtimetest[10939:303] fun3

2014-10-20 11:57:27.886 runtimetest[10939:303] varTest1

2014-10-20 11:57:27.886 runtimetest[10939:303] setVarTest1:

2014-10-20 11:57:27.887 runtimetest[10939:303] varTest2

2014-10-20 11:57:27.887 runtimetest[10939:303] setVarTest2:

2014-10-20 11:57:27.887 runtimetest[10939:303] varTest3

2014-10-20 11:57:27.888 runtimetest[10939:303] setVarTest3:

 

7

//获取一个类的所有属性

        u_int count;

        objc_property_t * properties = class_copyPropertyList([CustomClass class], &count);

        for (int i = 0; i < count; i++) {

            const char *  propertyName = property_getName(properties[i]);

            NSString * strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];

            NSLog(@"%@",strName);

        }

 

运行结果:

2014-10-20 12:01:23.508 runtimetest[11167:303] varTest1

2014-10-20 12:01:23.510 runtimetest[11167:303] varTest2

2014-10-20 12:01:23.510 runtimetest[11167:303] varTest3

 

8、获取/设置类的属性变量

 

//获取全局变量的值   (myFloat 为类的一个属性变量)

- (void) getInstanceVar {

    float myFloatValue;

    object_getInstanceVariable(self,"myFloat", (void*)&myFloatValue);

    NSLog(@"%f", myFloatValue);

}

//设置全局变量的值

- (void) setInstanceVar {

    float newValue = 10.00f;

    unsigned int addr = (unsignedint)&newValue;

    object_setInstanceVariable(self,"myFloat", *(float**)addr);

    NSLog(@"%f", myFloat);

}

9、判断类的某个属性的类型

 

- (void) getVarType {

    ClassCustomClass *obj = [ClassCustomClassnew];

    Ivar var = class_getInstanceVariable(object_getClass(obj),"varTest1");

    const char* typeEncoding =ivar_getTypeEncoding(var);

    NSString *stringType =  [NSStringstringWithCString:typeEncodingencoding:NSUTF8StringEncoding];

    

    if ([stringType hasPrefix:@"@"]) {

        // handle class case

        NSLog(@"handle class case");

    } else if ([stringTypehasPrefix:@"i"]) {

        // handle int case

        NSLog(@"handle int case");

    } else if ([stringTypehasPrefix:@"f"]) {

        // handle float case

        NSLog(@"handle float case");

    } else

    {

 

    }

}

 

10、通过属性的值来获取其属性的名字(反射机制)

 

- (NSString *)nameOfInstance:(id)instance

{

    unsigned int numIvars =0;

    NSString *key=nil;

    

    //Describes the instance variables declared by a class. 

    Ivar * ivars = class_copyIvarList([ClassCustomClassclass], &numIvars);

    

    for(int i = 0; i < numIvars; i++) {

        Ivar thisIvar = ivars[i];

        

        const char *type =ivar_getTypeEncoding(thisIvar);

        NSString *stringType =  [NSStringstringWithCString:typeencoding:NSUTF8StringEncoding];

        

        //不是class就跳过

        if (![stringType hasPrefix:@"@"]) {

            continue;

        }

        

        //Reads the value of an instance variable in an object. object_getIvar这个方法中,当遇到非objective-c对象时,并直接crash

        if ((object_getIvar(allobj, thisIvar) == instance)) {

            // Returns the name of an instance variable.

            key = [NSStringstringWithUTF8String:ivar_getName(thisIvar)];

            break;

        }

    }

    free(ivars);

    return key;

}

测试代码:

 

 

allobj = [ClassCustomClassnew];

    allobj.varTest1 =@"varTest1String";

    allobj.varTest2 =@"varTest2String";

    allobj.varTest3 =@"varTest3String";

    NSString *str = [selfnameOfInstance:@"varTest1String"];

    NSLog(@"str:%@", str);

 

 

打印结果:

 

2013-07-26 16:26:26.271 HighOC[7081:c07] str:varTest1

 

转载于:https://www.cnblogs.com/q403154749/p/4037175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值