Bone

探秘Runtime

左心房为你撑大大i 提交于 2019-12-06 17:57:00
该文章属于<简书 — 刘小壮>原创,转载请注明: <简书 — 刘小壮> https://www.jianshu.com/p/f313e8e32946 当一个对象的方法被调用时,首先在对象所属的类中查找方法列表,如果当前类中没有则向父类查找,一种找到根类 NSObject 。如果始终没有找到方法实现,则进入消息转发步骤中。 动态消息解析 当一个方法没有实现时,也就是在 cache lsit 和其继承关系的 method list 中,没有找到对应的方法。这时会进入消息转发阶段,但是在进入消息转发阶段前, Runtime 会给一次机会动态添加方法实现。 可以通过重写 resolveInstanceMethod: 和 resolveClassMethod: 方法,动态添加未实现的方法。其中第一个是添加实例方法,第二个是添加类方法。这两个方法都有一个 BOOL 返回值,返回 NO 则进入消息转发机制。 void dynamicMethodIMP(id self, SEL _cmd) { // implementation .... } + (BOOL)resolveInstanceMethod:(SEL)sel { if (sel == @selector(resolveThisMethodDynamically)) { class_addMethod([self class], sel,

为什么Dog对象不报空指针

半腔热情 提交于 2019-11-29 21:45:29
public class Test { public static void main(String[] args) { Dog dog = new Dog(); new Change().dogToNull(dog); dog.eat(); } } class Dog { String food = "bone"; void eat() { System.out.println(food); } void add(String food) { this.food = food; } } class Change { void dogToNull(Dog dog) { dog = null; } } 打印结果 bone 问题 为什么Dog对象不报空指针? 知识要点: 1.java在方法传递参数时,是将变量复制一份,然后传入方法体去执行 2.基本类型的变量放在栈里; 3.封装类型(引用对象类型)中,对象放在堆里,对象的引用放在栈里。 封装类型的传递 虚拟机在堆中开辟了一个Dog的内存空间,new出来的对象Dog存在堆里面 虚拟机在栈中分配给Dog一个内存地址p,这个地址值指向Dog的堆内存 虚拟机复制了一个p,我们叫他p#,p和p#的内存地址不同,指向值是同一个Dog堆内存 将p#传入dogToNull方法,p#设置为 null 只是栈中指向的引用为 null,但new

BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们

雨燕双飞 提交于 2019-11-29 16:02:43
BeagleBone Black快速入门教程第 1 章嵌入式 Linux 之于 Maker 们 Maker 的中文含义类似“创客”。创客是指一群酷爱科技、热衷实践的人群,他们以分享技术、交流思想为乐。但为了保持 Maker 的原味,这里我们一致使用英文的 Maker 。 Maker 文化是 DIY ( Do IT Yourself )文化的延伸,它在其中糅合了技术元素。本文选自《 BeagleBone Black快速入门教程大学霸》 1.1 Maker 的世界 Maker 们的兴趣主要集中在以工程化为导向的主题上,例如,电子、机械、机器人以及 3D 打印等,也包括相关工具的熟练使用,如 CNC (数控机床)、激光切割机等,还包括传统的金属加工、木工及艺术创作。他们善于挖掘新技术、鼓励创新与原型化,他们不单有想法、还有成型的作品,是“知行合一”的忠实实践者。他们注重在实践中学习新东西,并加以创造性的使用。 Maker 们对于新技术的嗅觉灵敏度是奇高的,对于 BeagleBone 这样的设备,一定不会逃过他们的法眼。当然,在介绍 BeagleBone 之前我们应该了解一下嵌入式 Linux 。 本文选自《 BeagleBone Black快速入门教程大学霸》 1.1.1 Maker 眼里的 Linux 如果你有听说过 Linux ,那么第一直觉就是它是一个计算机操作系统,就像 OS X