OC 动态类型,动态绑定,动态加载

Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有

  • 动态类型(Dynamic typing)
  • 动态绑定(Dynamic binding)
  • 动态加载(Dynamic loading)

动态类型:程序直到执行时才能确定所属的类。

id 数据类型
id 通用的对象类型,可以存储任意类型的对象,id后面没有号,它本身就是个指针
类似于void 
,但只可以指向对象类型

静态类型与动态类型

  1. 编译期检查与运行时检查
  2. 静态类型在编译期就能检查出错误
  3. 静态类型声明代码可读性好
  4. 动态类型只有在运行时才能发现错误

动态绑定:程序直到执行时才能确定实际要调用的方法。

动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。

BOOL类型

bool是C语言的布尔类型,有true和false,BOOL是Objective C 语言的布尔类型,有YES和NO,因为OC可以跟C混编,所以bool和BOOL可以同时出现在代码中

BOOL深入解析:
typedef signed char BOOL;
BOOL类型有两个值YES,NO。YES=1,NO=0。

说明:objective-c 中的BOOL实际上是一种对带符号的字符类型(signed char)的类型定义(typedef),它使用8位的存储空间。通过#define指令把YES定义为1,NO定义为0。

    Class类:表示一个类名,class被创建后,我们可以把class来当成对象的类。

    Class cla1 = [类名 class]
    Class cla2 = [对象 class]
    Class cla3 = NSClassFromString(@"类名");
    SEL 类成员方法的指针

    可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
    它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)

     1>类里面的方法都是被转换成SEL变量进行存储的。
     2>放类声明一个对象,对象调用方法的时候,系统会被这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。
     3>我们可以自己手动把方法转换成SEL,然后用这个SEL去查找方法(performSelector)。
    -isMemberOfClass:
    判断是否是这个类的实例
    -isKindOfClass:
    判断是否是这个类或者这个类的子类的实例
    -respondsToSelector:
    判读实例是否有这样方法
    +instancesRespondToSelector:
    判断类是否有这个方法。此方法是类方法。

动态加载:根据需求加载所需要的资源

这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图。随着Retina iPad的推出,和之后可能的Retina Mac的出现,这个特性相信会被越来越多地使用。

赠品

多态的出现时为了让不同的类能使用同名的方法。这个让程序的可读性大大提高,也降低了编程难度。

动态类型与动态绑定是为了解决随多态的便利而引起的弊端,有了动态类型与动态绑定,不用去考虑输出中的方法是哪个类型的方法,会自动判定。

而id类型的出现就是为了更好的承接动态类型与动态方法出来的返回值。

时间: 2024-11-10 00:56:28

OC 动态类型,动态绑定,动态加载的相关文章

动态类型 动态绑定 动态加载

1.动态类型运行时才知道,对象的类型,动态类型在编程中非常常见,简单的说就是id类型 比如代理在自定的时候就是,id类型.当前我们有时候自己定的方法,不确定,传进来的是什么类型的对象,我们也id类型,然后在方法内部去确定类型 2.动态绑定 对象被实例化后,就确定的对象类型,也确定了对象的属性和响应方法.这就是动态绑定. 说白也就是对象的确定了后,会绑定对应的属性和方法.那么我们也就可以动态的去给对象添加和实现方法.Class_addMethod 和 Method_setImplementatio

AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖

好了,现进入正题,在 AngularJs 实现动态(懒)加载主要是依赖于3个主JS文件和一段依赖的脚本. 实现的过程主要是引用3个主要的JS文件 <script src="angular/1.4.8/angular/angular.min.js"></script> <script src="angular/ui-router/release/angular-ui-router.min.js"></script> &l

动态script标签同步加载 ps:无打包编译,静态实现静态资源入口动态配置,无编译打包静态资源添加版本号

/**功能:创建动态标签加载css ,js文件,重点是js文件,利用onloading加递归实现动态标签的同步加载用法:在html文件body底部script内部声明并调用下列函数,obj中写要加载的文件信息注意,由于css是后来加载的,所以页面会存在无样式的页面骨架闪烁问题,可以在头部head标签里加个body{opacity:0},在css文件中再改为body{opacity:1} */ function noAsyncScriptTag() { var obj = { pubPath: "

hive原生和复合类型的数据加载和使用

原生类型 原生类型包括TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY (Hive 0.8.0以上才可用),TIMESTAMP (Hive 0.8.0以上才可用),这些数据加载很容易,只要设置好列分隔符,按照列分隔符输出到文件就可以了. 假设有这么一张用户登陆表 CREATE TABLE login ( uid BIGINT, ip STRING ) ROW FORMAT DELIMITED FIELDS TERMINA

Android知识体系梳理笔记三:动态代理模式---插件加载机制学习笔记

静态代理模式 静态代理模式就是我们常说的代理设计模式,我们采用一个代理类调用原有的方法,且对产生的结果进行控制:举个例子:我们现在在玩一款网络游戏,需要打怪升级:太累就找个代理吧,一觉醒来就会发现我们已经当上CEO,迎娶白富美,天下第一了! 本来我们只能打怪,打怪-,但经过代理类增强,我们不仅可以打怪,还可以升级拿装备.就这样子了! 上代码: * 同一功能接口 public interface PlayNetGame { String beatMonster(); } 1 2 3 4 1 2 3

Android动态类生成预加载-dexmaker使用

一.dexmaker简单介绍 dexmaker是运行在Android Dalvik VM上,利用Java编写,来动态生成DEX字节码的API.如果读者了解AOP编程的话,应该听说过cglib or ASM,但这两个工具生成都是Java字节码,而Dalvik加载的必须是DEX字节码.所以,想要在Android上进行AOP编程,dexmaker可以说是一个很好的选择.项目地址:https://github.com/crittercism/dexmaker. 二.简单使用 下面这个例子非常典型,可以说

python爬虫 selenium+phantomjs动态解析网页,加载页面成功,返回空数据

废话不多说,直接说重点: 刚开始做的时候,代理IP,头部信息池,都已经做好了,使用selenium+phantomjs获取js动态加载后的源码 起初挺好的,能出来动态加载后的源码,但是运行了几次之后,电脑有点卡顿(估计是运存太小),源码就获取不到了,返回的数据 都是空数据,以至于都是出错 在做的时候一定要给页面加载之前做一个延时,以保证页面的正常加载出来,这样我们才能获取导数据 我在加载前后都做了延时等待,当然,我这个就是说这个意思,没必要仿照 可以根据自己的需求进行设置,然后源码就加载出来了,

javascript动态创建script标签,加载完成后调用回调

代码如下: var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.charset = 'GBK'; script.onload = script.onreadystatechange = function() { if (!this.readyState || this.r

《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节

在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定,比如:var a=1:a="aa":此时编译器就会报错,因为var在初次定义是已经被分配为int类型,它无法用于返回值.参数或者类/结构.这个时候就要想到所有类型的父类object,按照继承关系来说,object是所有类型的父类,所以它可以替代所有的类,也就是说:object a=1:a=