A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangganghua 中级黑马   /  2015-9-17 22:46  /  1010 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

动态特性基础:
1、动态类型
即运行时再决定对象的类型。这类动态特性在日常应用中非常常见,简单说就是id类型。id类型即通用的对象类,任何对象都可以被id指针所指,而在实际使用中,往往使用introspection来确定该对象的实际所属类:
 
动态类型,说简单点就是id类型。
动态类型是跟静态类型相对的。
像内置的明确的基本类型都属于静态类型(int、NSString等)。
静态类型在编译的时候就能被识别出来。所以,若程序发生了类型不对应,编译器就会发出警告。
而动态类型就编译器编译的时候是不能被识别的,要等到运行时(run time),即程序运行的时候才会根据语境来识别。所以这里面就有两个概念要分清:编译时跟运行时。
 
 
2,动态绑定:
动态绑定是基于动态类型的:
基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。
动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。
 
 
 
3,动态加载:
Objective-C Runtime动态加载】---动态创建类Class   
动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法
a.使用objc_allocateClassPair创建一个类Class
    const char * className = "Calculator";
    Class kclass = objc_getClass(className);
    if (!kclass) 
    {
       Class superClass = [NSObject class]; 
       kclass = objc_allocateClassPair(superClass, className, 0);
    }
 
b.使用class_addIvar添加一个成员变量
    NSUInteger size;
    NSUInteger alignment;
    NSGetSizeAndAlignment("*", &size, &alignment);
    class_addIvar(kclass, "expression", size, alignment, "*");
  注:
    1.type定义参考:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
    2."*"星号代表字符(),iOS字符为4位,并采用4位对齐kclass
 
c.使用class_addMethod添加成员方法
    class_addMethod(kclass, @selector(setExpressionFormula:), (IMP)setExpressionFormula, "v@:@");
    class_addMethod(kclass, @selector(getExpressionFormula), (IMP)getExpressionFormula, "@@:");
 
    static void setExpressionFormula(id self, SEL cmd, id value)
    {
       NSLog(@"call setExpressionFormula");
    }
 
    static void getExpressionFormula(id self, SEL cmd)
    {
        NSLog(@"call getExpressionFormula");
    } 
 注:
    1.type定义参考:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
    2."v@:@",解释v-返回值void类型,@-self指针id类型,:-SEL指针SEL类型,@-函数第一个参数为id类型
    3."@@:",解释@-返回值id类型,@-self指针id类型,:-SEL指针SEL类型,
d.注册到运行时环境
    objc_registerClassPair(kclass);
e.实例化类
    id instance = [[kclass alloc] init];
f.给变量赋值
   object_setInstanceVariable(instance, "expression", "1+1"); 
g.获取变量值
    void * value = NULL;
    object_getInstanceVariable(instance, "expression", &value); 
h.调用函数
    [instance performSelector:@selector(getExpressionFormula)];
 
 
 
内省:
内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。
内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。
 
通俗讲: 内省是对象运行时获取其详细信息的能力.
 
1、isKindOfClass:Class
判断实例对象是否是这个类或者这个类的子类的实
例。
 
2、isMemberOfClass:Class
判断是否是这个类的实例。
 
3、+(BOOL) isSubclassOfClass:classObj
判断类是否是指定类的子类。
 
4、respondToSelector:selector
确定对象是否可以对某个SEL做出响应
 
5、+(BOOL) instancesRespondToSelector:
判断类是否有这个方法。此方法是类方法, 不能用在类的对象
 
6、conformsToProtocol:protocol
检查对象是否符合协议,是否实现了协议中所有的必选方法。

1 个回复

倒序浏览
详细,好,值得收藏。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马