函数调用

Runtime-iOS运行时基础篇

孤街浪徒 提交于 2020-02-04 00:16:54
转自:https://www.jianshu.com/p/d4b55dae9a0d   本文主要整理了Runtime的相关知识。对于一个iOS开发者来说,掌握Runtime的重要性早已不言而喻。OC能够作为一门优秀的动态特性语言,在其背后默默工作着的就是Runtime。在网上也看过很多资料,最终我还是希望在一些关键的知识点上能够融入自己的理解,从简单的问题出发,一步一步理解和学以致用。 iOS运行时Runtime.png 相关文章:iOS运行时Runtime应用 目录: 一、怎么理解OC是动态语言,Runtime又是什么? 二、理解消息机制的基本原理 三、与Runtime交互的三种方式 四、分析Runtime中的数据结构 五、深入理解Rutime消息发送原理 六、多继承的实现思路:Runtime 七、最后总结 一、怎么理解OC是动态语言,Runtime又是什么? 静态语言 :如C语言,编译阶段就要决定调用哪个函数,如果函数未实现就会编译报错。 动态语言 :如OC语言,编译阶段并不能决定真正调用哪个函数,只要函数声明过即使没有实现也不会报错。 我们常说OC是一门动态语言,就是因为它总是把一些决定性的工作从编译阶段推迟到运行时阶段。OC代码的运行不仅需要编译器,还需要运行时系统(Runtime Sytem)来执行编译后的代码。 Runtime是一套底层纯C语言API

javascript 高级 笔记整理

蓝咒 提交于 2020-02-03 22:44:11
目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript 中使用正则表达式 JavaScript 的组成 ECMAScript - 语法规范 变量、数据类型、类型转换、操作符 流程控制语句:判断、循环语句 数组、函数、作用域、预解析 对象、属性、方法、简单类型和复杂类型的区别 内置对象:Math、Date、Array,基本包装类型String、Number、Boolean Web APIs BOM onload页面加载事件,window顶级对象 定时器 location、history DOM 获取页面元素,注册事件 属性操作,样式操作 节点属性,节点层级 动态创建元素 事件:注册事件的方式、事件的三个阶段、事件对象 面向对象与面向过程: 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊 面向对象就是找一个对象,指挥得结果 面向对象将执行者转变成指挥者 面向对象不是面向过程的替代,而是面向过程的封装 面向对象的特性: 封装性 继承性 [多态性]抽象 prototype对象 JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象。 这个对象的所有属性和方法,都会被构造函数的所拥有。 这也就意味着,我们可以把 所有对象实例需要共享的属性和方法直接定义在 prototype 对象上 。

java基础复习-自定义注解2(反射技术)

烂漫一生 提交于 2020-02-03 22:09:27
java基础复习-自定义注解2(反射技术) 写在前面: 反射技术在java基础中也是容易被忽略的一部分内容,也是在初学阶段无法体会反射技术的作用。其实,在java的众多框架中都是靠反射技术来进行实现。如果想成为能够自己去打造自己的框架,那么学习反射技术这是十分有必要的。该节被列为自定义注解的第二节,将介绍反射技术的使用和如何反射获取注解上的信息,编写一个简单的注解解析器。 1、反射介绍 考虑到有部分大学java课程中没有收录该部分内容,因此作为一个简短的介绍。 众说周知,java代码的编译是编译为.class文件,.class文件是运行在jvm上的,而并不是像C\C++语言一样,编译为二进制语言,运行在真实的操作系统上。即然,.class文件还处于jvm中,那么就能够从其中获取信息。 JAVA反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。 因为有反射技术的存在

函数调用规范

喜你入骨 提交于 2020-02-03 14:08:58
当高级语言函数被编译成机器码时,有一个问题就必须解决:因为CPU没有办法知道一个函数调用需要多少个、什么样的参数。即计算机不知道怎么给这个函数传递参数, 传递参数的工作必须由函数调用者和函数本身来协调 。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明: 1) 当参数个数多于一个时,按照什么顺序把参数压入堆栈; 2) 函数调用后,由谁来把堆栈恢复原装。 3)函数的返回值放在什么地方 在高级语言中,通过函数 调用规范(Calling Conventions) 来说明这两个问题。常见的调用规范有: stdcall cdecl fastcall thiscall naked call stdcall调用规范 stdcall很多时候被称为pascal调用规范,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定是stdcall。在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK。 stdcall调用规范声明的语法为: int __stdcall

自己动手开发jQuery插件全面解析 jquery插件开发方法

心不动则不痛 提交于 2020-02-03 12:43:10
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。 1、类级别的插件开发 类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展: 1.1 添加一个新的全局函数 添加一个全局函数,我们只需如下定义: JavaScript Code 复制内容到剪贴板 jQuery.foo = function() { alert( 'This is a test. This is only a test.'); }; 1.2 增加多个全局函数 添加多个全局函数,可采用如下定义: JavaScript Code 复制内容到剪贴板 jQuery.foo = function() { alert( 'This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert( 'This function takes a parameter,

2、整数逆序的多种方法

青春壹個敷衍的年華 提交于 2020-02-03 07:22:11
2、整数逆序的多种方法 一、递归法逆序 :输入一个正整数n,将其逆序输出。要求定义和调用函数reverse(num),其功能是将num逆序输出,要求用递归实现。 二、经典常用的 :关键代码是 d = x%10; ret=ret*10 + d; 三、更简单的 :仅针对三位整数 四、更复杂的 :仅针对三位整数 五、 : 说明:x/100得x的百位数字,x%100则是去掉x的百位数字,x%10得x的个位,依此类推。 //一、递归法逆序: # include <stdio.h> void reverse ( int n ) ; int main ( ) { int n ; scanf ( "%d" , & n ) ; reverse ( n ) ; return 0 ; } void reverse ( int n ) { if ( n < 10 ) { printf ( "%d" , n ) ; } else { printf ( "%d" , n % 10 ) ; reverse ( n / 10 ) ; } } //二、经典常用的: # include <stdio.h> int main ( ) { int x , d , ret = 0 ; scanf ( "%d" , & x ) ; while ( x > 0 ) { d = x % 10 ; ret = ret * 10 +

Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器

◇◆丶佛笑我妖孽 提交于 2020-02-03 05:44:37
文章目录 一、__getattr__和__getattribute__魔法函数 二、属性描述符 1.属性描述符分析 2.属性查找顺序 三、自定义元类 1.动态创建类 2.使用type创建类 四、metaclass属性 五、迭代器和生成器 1.迭代器 2.生成器 应用:生成器读取大文件 一、__getattr__和__getattribute__魔法函数 from datetime import date class User : def __init__ ( self , name , birthday ) : self . name = name self . birthday = birthday if __name__ == "__main__" : user = User ( "corley" , date ( year = 2020 , month = 1 , day = 1 ) ) print ( user . name ) 打印 corley 当打印不存在的属性时,会报错: from datetime import date class User : def __init__ ( self , name , birthday ) : self . name = name self . birthday = birthday if __name__ == "__main

初识C++函数重载

一世执手 提交于 2020-02-02 23:46:46
文章目录 函数重载 什么是函数重载 为什么要函数重载 函数重载中要注意的一些细节 函数重载与作用域 函数匹配【重载确定】 重载和const形参 const_cast和函数重载 函数重载 什么是函数重载 函数重载是指在同一作用域内, 函数名相同 而 形参列表不同 的一组函数。 编译器首先将调用的实参与重载集合中每一个函数的形参作比较,然后根据比较的结果决定调用哪一个函数。 为什么要函数重载 重载函数通常用来命名一组功能相似的函数,增强了程序的可读性,函数重载在一定程度上减轻了程序员起名字,记名字的负担。 比如操作符重载在本质上也是函数重载,其大大丰富了已有操作符的含义,方便记忆和使用。 函数重载中要注意的一些细节 函数重载与作用域 如果我们在内层作用域中声明名字,那么它将隐藏外层作用域中声明的同名实体,在不同的作用域中无法重载函数名。 函数匹配【重载确定】 函数匹配【重载确定】是指一个过程,在这个过程中我们把函数调用与一组重载函数中的某一个关联起来。 编译器首先将调用的实参与重载集合中每一个函数的形参作比较,然后根据比较的结果决定调用哪一个函数。 大多数情况下,重载集合中的函数区别明显,它们要么是函数形参的数量不同,要么是函形参类型毫无关系,这种情况下确定调用哪一个函数是比较容易的。但是当两个重载函数的形参数量相同且形参类型之间可以相互转换时,如何选择函数就值得我们注意了

C++面试

泪湿孤枕 提交于 2020-02-02 14:31:08
vector中v[i]和v.at(i)的区别 v[5]; //A v.at[5]; //B 如果v非空,A和B没有任何区别。如果v为空,B会抛出std::out_of_range异常。 c++标准不要求vecor<T>::operator[]进行下标越界检查,原因是为了提高效率。如果需要下标越界检查,使用at。但性能会受到影响,因为越界检查增加了性能开销。 vector扩容原理 新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素; 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了; 初始时刻vector的capacity为0,塞入第一个元素后capacity增加为1; 不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容 哪些函数不能成为虚函数? 不能被继承的函数和不能被重写的函数。 1.普通函数 2.友元函数 3.构造函数 4.内联成员函数 5.静态成员函数 溢出 1.栈溢出(栈的大小通常是1M-2M) 栈溢出是指函数中的局部变量造成的溢出(注:函数中形参和函数中的局部变量存放在栈上) 栈溢出包含两种情况:1.分配的的大小超过栈的最大值,2.分配的大小没有超过最大值,但是分配的buff比接收buff小

实验七——函数定义及调用总结

醉酒当歌 提交于 2020-02-02 09:31:25
1. 本次课学习到的知识点 : 函数 定义:函数是一个完成特定工作的独立程序模块,包括函数和自定义函数两种: 1.scanf(),printf()等为库函数,由c语言系统提供定义,编程时只要直接调用即可。 2. cylinder(),fact()函数,需要用户自己定义,为自定义函数。 (2)cylinder(),fact()功能不同,但他们能实现一个计算,并可以得到一个明确的计算结果。 (3) 函数定义的一般形式为: 函数类型 函数名(形式参数表) { 函数实现过程 } 函数首部由函数类型,函数名和形式参数表组成,位于函数定义第一行。函数类型指函数结果返回的类型,一般与return语句中表达式的类型一致。形参表中给出函数计算所要用到的相关已知条件,以类似变量定义的形式给出。 函数结果返回: return 表达式。 函数声明是一条c语言,而函数定义时的函数首部不是语句,后面不能跟分号. 2. 实验过程中遇到的问题及解决方法: (1) 将程序改写成函数的调用形式是容易出现格式错误 (2)会发现程序编译正确,结果却不正确,却不能发现问题在哪。 3. 实验心得体会及本章学习总结: 对函数有了新的理解,学习了函数的定义和使用,对函数的调用形式、参数传递、原型声明有了初步的了解。也熟练了基础的函数程序设计。 4.预习 (1) 不返回结果的函数: 定义:void函数名(形参表) /*函数首部*/