生存周期:自动引用计数

前边铺垫了那么多,现在终于要讲到垃圾回收这个东西了。

ARC

这不是方舟……这是自动引用计数(Automatic Reference Counting),这个东西是苹果用来管理内存的。

它的功能就是那个垃圾堆上的垃圾回收器。它能够保证所有在堆上运行的对象被释放后不会一直驻留在堆上。保证了那块内存会再分配给其他要使用的对象上。

何为释放

说到对象会不会被垃圾回收器给收走,那就要看引用会[……]

点击跳转以继续阅读

初始化器

在上一节课的末尾,我们最终明确了一个对象的创建过程,那么,说起来创建一个对象的样子很像是调用了一个方法,可这个方法到底是什么呢?

初始化器

没错的,当我们初始化了一个类为对象的时候,我们确实调用了一个方法——初始化器。

初始化器其实就是一个特殊规定了的方法,它能够为类进行初始化。

想象一下,如果没有初始化器,那么我们调用的类就一定是千篇一律的,每一次都要先创建对象,再修改它的属性?[……]

点击跳转以继续阅读

“堆栈”:到底什么事“堆”,什么是“栈”?

是时候来看看对象和方法的生存空间了——想要了解面向对象,不知道方法和对象放在哪里是一件很尴尬的事情——毕竟我们还是要面对垃圾收集器的,想要让垃圾收集器帮你做更多的事情,我们就得一定程度上了解它的工作机制,了解方法和对象存放在哪里,否则的话,你就又要写出一个不堪一击的程序来了!

我们在前边的课程当中已经基本地提过堆的概念,没错,对象(实例)是放在堆上的——我将它形象地描述为“垃圾堆”。

被堆[……]

点击跳转以继续阅读

“致命方块”:多重继承与协议

上节课我们提到了协议,但是只讲了它的一种应用方式,这节课我们就来深入地了解一下这个用起来和 class 差不多的协议究竟有什么高深奥义。

现在,我们要再一次回顾那个可耻的继承树:

这里我们写了武器……是用来进行攻击和防守的。那么,作为一个游戏,武器的模型不能够单单只用在这一个地方,不然的话开发的成本就太大了——我们要尽可能的榨干代码的价值。

我们与设计师沟通以后,设计师想[……]

点击跳转以继续阅读

协议:不允许实例化的类以及必须被重写的方法

说了方法的重写,我们再回过头来看看那个继承树:

这个看起来应该还行,我们可以创建大刀的实例,创建手枪的实例……

但是如果我要这样写呢?

那么问题来了:挖掘机……

不,我们的问题是“武器”到底是个什么东西?

我们说“动物”,人是动物,鸟是动物,狗、猫都是动物,那有没有个动物是动物呢?

答案是没[……]

点击跳转以继续阅读

自定义:override!

说了那么多次的重写,这次我们就来认真的对待一下方法的重写。

合约

我们说了,继承就相当于是签订合约,我们继承出来的子类一定要遵守这个合约,那么就算你想要做一些合约里没有的事情,也要遵守合约的规范,所以,你重写方法,也一定要符合方法的类型。

我们讲过方法的类型,它以 ()->() 这样来表示。所以,重写的方法也一定要遵守这个类型即接收参数返回参数类型要相同……名字要相同还需要我说吗?[……]

点击跳转以继续阅读

多肽?多态!

上一节课我们说完了继承,那这节课我们就继续深入,来看看继承树的大招是什么。

可能我和你说起多态这个发音,你最先想到的应该是高中生物里讲的“多肽”;好吧,这两者之间唯一相同的可能就是发音了。

继承的意义

我们说继承实现的意义非凡,它大大降低了我们代码中的冗余行数,降低了代码的维护难度……

其实,我没有提到继承的另一个意义——合约。

上一节课我们做了演示,继承代表了子类获得了父类[……]

点击跳转以继续阅读

到底怎么办:“是一个”与“有一个”

上节课我们具体地讲述了继承的机制,并且也设计了一个继承树,那么问题来了:我不是要问挖掘机技术哪家强?我是要问如何来确定一个类是另一个类的子类呢?我们又如何设计一个类而不是某个类中的属性呢?

“是一个”与“有一个”

这里我们就要用这么一个方法来检验它们二者之间的关系了:

我们说,手枪是枪械——OK,没有问题,那么手枪这个类就是枪械的子类。

还有长剑是一把剑,是一个冷兵器——没问题,那这样[……]

点击跳转以继续阅读

再次回顾:继承

我们这次一起来回顾一下之前几节课里提到的继承,我们曾在初见 OOP 里用了一个开发手机(系统)的栗子来描述继承这个东西,相信大家还有印象。

继承

那么这节课我们就深入的来了解了解继承这个概念。

这个其实也不难理解,你看,当你的父辈去世,那他们的财富就会由你继承——好吧,这不是一件很值得开心的事情,但这毕竟是事实。[……]

点击跳转以继续阅读