IOS高级开发~Runtime(二)

*一些公用类:
*

@interface ClassCustomClass :NSObject{

<span class="s2">NSString</span> *varTest1;

<span class="s2">NSString</span> *varTest2;

<span class="s2">NSString</span> *varTest3;

}

@property (nonatomic,assign)NSString *varTest1;

@property (nonatomic,assign)NSString *varTest2;

@property (nonatomic,assign)NSString *varTest3;

  • (void) fun1;

@end

@implementation ClassCustomClass

@synthesize varTest1, varTest2, varTest3;

  • (void) fun1 {

    NSLog(@”fun1”);

}

@end

@interface ClassCustomClassOther :NSObject {

<span class="s1">int</span> varTest2;

}

  • (void) fun2;

@end

@implementation ClassCustomClassOther

  • (void) fun2 {

    NSLog(@”fun2”);

}

@end

 

@interface ClassPropertyViewCtr () {

<span class="s1">float</span> myFloat;

ClassCustomClass *allobj;

}

myFloat = 2.34f;

 

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

  • (void) getClassAllMethod

{

<span class="s2">u_int</span> count;

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

<span class="s1">for</span> (<span class="s1">int</span> i = <span class="s4">0</span>; i &lt; count ; i++)

{

    <span class="s1">SEL</span> name = <span class="s2">method_getName</span>(methods[i]);

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

    <span class="s2">NSLog</span>(<span class="s5">@"%@"</span>,strName);

}

}

打印结果(部分):

2013-07-26 16:07:03.972 HighOC[7021:c07] _screen

2013-07-26 16:07:03.973 HighOC[7021:c07] applicationWillSuspend

2013-07-26 16:07:03.973 HighOC[7021:c07] _tryBecomeRootViewControllerInWindow:

2013-07-26 16:07:03.973 HighOC[7021:c07] isViewLoaded

2013-07-26 16:07:03.974 HighOC[7021:c07] view

………………….

7、获取一个类的所有属性:

  • (void) propertyNameList

{

<span class="s2">u_int</span> count;

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

<span class="s1">for</span> (<span class="s1">int</span> i = <span class="s4">0</span>; i &lt; count ; i++)

{

    <span class="s1">const</span> <span class="s1">char</span>* propertyName =<span class="s2">property_getName</span>(properties[i]);

NSString *strName = [NSString stringWithCString:propertyNameencoding:NSUTF8StringEncoding];

    <span class="s2">NSLog</span>(<span class="s5">@"%@"</span>,strName);

}

}

打印结果(部分)

2013-07-26 16:09:42.182 HighOC[7041:c07] tabBarItem

2013-07-26 16:09:42.184 HighOC[7041:c07] tabBarController

2013-07-26 16:09:42.185 HighOC[7041:c07] splitViewController

2013-07-26 16:09:42.186 HighOC[7041:c07] navigationItem

2013-07-26 16:09:42.186 HighOC[7041:c07] hidesBottomBarWhenPushed

……………

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);

<span class="s3">NSLog</span>(<span class="s4">@"%f"</span>, <span class="s7">myFloat</span>);

}

 

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

  • (void) getVarType {

ClassCustomClass *obj = [ClassCustomClassnew];

Ivar var = class_getInstanceVariable(object_getClass(obj),“varTest1”);

<span class="s1">const</span> <span class="s1">char</span>* typeEncoding =<span class="s3">ivar_getTypeEncoding</span>(var);

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

<span class="s1">if</span> ([stringType <span class="s3">hasPrefix</span>:<span class="s4">@"@"</span>]) {

// handle class case

NSLog(@”handle class case”);

} <span class="s1">else</span> <span class="s1">if</span> ([stringType<span class="s3">hasPrefix</span>:<span class="s4">@"i"</span>]) {

// handle int case

NSLog(@”handle int case”);

} <span class="s1">else</span> <span class="s1">if</span> ([stringType<span class="s3">hasPrefix</span>:<span class="s4">@"f"</span>]) {

// handle float case

NSLog(@”handle float case”);

} <span class="s1">else</span>

{

}

}

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

  • (NSString *)nameOfInstance:(id)instance

{

<span class="s2">unsigned</span> <span class="s2">int</span> numIvars =<span class="s3">0</span>;

<span class="s1">NSString</span> *key=<span class="s2">nil</span>;

//Describes the instance variables declared by a class.

<span class="s1">Ivar</span> * ivars = <span class="s1">class_copyIvarList</span>([<span class="s5">ClassCustomClass</span><span class="s1">class</span>], &amp;numIvars);

<span class="s2">for</span>(<span class="s2">int</span> i = <span class="s3">0</span>; i &lt; numIvars; i++) {

    <span class="s1">Ivar</span> thisIvar = ivars[i];

    <span class="s2">const</span> <span class="s2">char</span> *type =<span class="s1">ivar_getTypeEncoding</span>(thisIvar);

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

//不是class就跳过

<span class="s2">if</span> (![stringType <span class="s1">hasPrefix</span>:<span class="s7">@"@"</span>]) {

    <span class="s2">continue</span>;

}

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

<span class="s2">if</span> ((<span class="s1">object_getIvar</span>(<span class="s5">allobj</span>, thisIvar) == instance)) {

// Returns the name of an instance variable.

key = [NSStringstringWithUTF8String:ivar_getName(thisIvar)];

        <span class="s2">break</span>;

    }

}

<span class="s1">free</span>(ivars);

<span class="s2">return</span> key;

}

测试代码:

allobj = [ClassCustomClassnew];

allobj.varTest1 =@”varTest1String”;

allobj.varTest2 =@”varTest2String”;

allobj.varTest3 =@”varTest3String”;

<span class="s2">NSString</span> *str = [<span class="s4">self</span><span class="s3">nameOfInstance</span>:<span class="s5">@"varTest1String"</span>];

<span class="s2">NSLog</span>(<span class="s5">@"str:%@"</span>, str);

打印结果:

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

Share Comments