1、面向过程和面向对象思想的思考方式
编程题:模拟电脑里面酷我音乐盒播放音乐的流程。
(1)面向过程的思考方式
第一步:打开电脑
第二步:打开酷我音乐盒
第三步:点击播放
第四步:点击下一首
第五步:点击暂停
第六步:关闭酷我音乐盒
第七步:关闭电脑
面向过程:按照一定的顺序(过程)来思考。
(2)面向对象的思考方式
第一步: [电脑 开机]
第二步: [[电脑 酷我音乐盒] 打开]
第三步: [[电脑 酷我音乐盒] 播放]
第四步: [[电脑 酷我音乐盒] 切换下一首]
第五步: [[电脑 酷我音乐盒] 暂停]
第六步: [[电脑 酷我音乐盒] 关闭]
第七步: [电脑 关机]
面向对象:将具体的某台电脑和这台电脑里面的酷我音乐盒分别看成一个具体的对象,这台电脑具备开机、关机的能力,电脑里面的酷我音乐盒具备打开、播放、暂停、下一首、关闭等能力,第一步: [电脑 开机]的意思是通知电脑开机,第二步: [[电脑 酷我音乐盒] 打开]的意思是通知电脑里面的酷我音乐盒打开,第三步: [[电脑 酷我音乐盒] 播放]意思是通知电脑里面的酷我音乐盒播放音乐,第七步: [电脑 关机]意思是通知电脑关机,面向对象就是在每一个步骤中处理具体的任务时,都是给具体的某一个对象发消息,让对象去处理。
备注:面向过程和面向对象只是一种思想,并不针对某一门语言,如果面向对象思想理解的比较透,也可以用c语言写成面向对象的代码,当然就算是纯面向对象的语言,也是面向过程和面向对象混合使用
2、什么是类,什么是对象?
类是一个抽象的概念,比如电脑就是一个类,电脑是一个抽象的东西,如果刚开始给电脑命名叫栗子,那今天我们大家就会去栗子专卖店买栗子来办公,而不是去电脑专卖店买电脑,但是事实是不管名字怎么叫,我们买到的就是今天办公桌上的电脑,所以说类是一个抽象的东西,类只是对某一个或者说某一个相似的群体的一些和行为的描述。
类和对象现实生活例子对比:
在上表中,功夫明星是类,类一个抽象的概念,李小龙、成龙、李连杰他们是具体的,所以他们是对象,功夫明星是对李小龙、成龙、李连杰等具体对象的属性和行为的一个抽象,功夫明星都具备功夫的属性,还具备能够拍戏等行为,再比如电脑也是一个抽象的概念,你的电脑、你对象的电脑和你对象的前任的电脑都是具体的事物,它们都都有自己的品牌,大小,颜色等属性,还具备开机、关机、安装和卸载软件等能力,对象是具体的某一个事物,而类是抽象的概念。再比如中国各大培训公司中有育知同创、学大教育、新东方,育知同创、学大教育、新东方都是具体的,她们有各自培训的专项,比如育知同创专注培训iOS、Android、HTML5等学科,新东方专注培训英语,这都是她们各自的属性,大家听到新东方时,会想到俞敏洪,同样的道理,大家看见育知同创时,会联想到Mars,俞敏洪和Mars都是CEO,他们分别是新东方和育知同创的CEO这个属性的值。
小结:类是抽象的一个概念,是对一类具有相似属性和行为的事物的一个抽象描述。对象是具体的某一事物,从不同的属性和行为,某一个对象可以被划分为不同的类。
3、在Objective-C中如何创建一个类?
4、指针VS对象
//
// main.m
// FirstProject
//
// Created by Lucien老师 on 16/4/14.
// Copyright © 2016年 Lucien老师. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Lecturer.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
在我们育知同创有很多教室,每一个教室都在门上贴了一个标签,标签的名字是classroom001~classroom100,如果从地理的角度来看待每一个门上的标签和标签所对应的教室的话,每个标签都由一个唯一的经纬度来决定自己所处的位置,每个教室也有自己一个独一无二的经纬度
我们的每一个教室可以理解为每一块存储对象的内存空间,每一个教室的唯一的经纬度可以理解为每一块内存的地址,每一个教室的门牌号可以理解为每一个指向存储这个对象的内存空间的指针,每一块内存就像教室一样有自己的唯一的地址,每一个指针就像门牌号一样也有自己独一无二的地址,当讲师进入教室时,我们可以理解为创建了一个新对象并且向计算机申请了一块空间存储这个对象,当讲师离开教室时,我们可以理解为对象自动调用dealloc函数销毁自己,讲师离开教室,教室还在,教室的经纬度保持不变,门牌号还在,门牌号的经纬度保持不变,同理,当对象被销毁后,存储这个对象的空间还在,并且地址没发生变化,指针空间的地址在没超出其作用域之前,指针还在,并且指针的地址仍然保持不变
*/
Lecturer *classroom001 = [[Lecturer alloc] initWithName:@"Lucien"];
NSLog(@"一个叫Lucien的老师进入到地址为%p的教室,这个教室的门牌号为classroom001,classroom001的地址为%p",classroom001,&classroom001);
[classroom001 release];
NSLog(@"一个叫Lucien的老师从地址为%p的教室离开后,教室的地址并不会因为Lucien离开而改变,这个教室的门牌号仍然为classroom001,classroom001的地址仍然为%p",classroom001,&classroom001);
Lecturer *classroom002 = [[Lecturer alloc] initWithName:@"Steven"];
NSLog(@"一个叫Steven的老师进入到地址为%p的教室,这个教室的门牌号为classroom002,classroom002的地址为%p",classroom002,&classroom002);
[classroom002 release];
NSLog(@"一个叫Steven的老师从地址为%p的教室离开后,教室的地址并不会因为Steven离开而改变,这个教室的门牌号仍然为classroom002,classroom002的地址仍然为%p",classroom002,&classroom002);
Lecturer *classroom003 = [[Lecturer alloc] initWithName:@"David"];
NSLog(@"一个叫David的老师进入到地址为%p的教室,这个教室的门牌号为classroom003,classroom003的地址为%p",classroom003,&classroom003);
[classroom003 release];
NSLog(@"一个叫David的老师从地址为%p的教室离开后,教室的地址并不会因为David离开而改变,这个教室的门牌号仍然为classroom003,classroom003的地址仍然为%p",classroom003,&classroom003);
/*
2016-04-15 09:36:21.789 FirstProject[678:9822] 一个叫Lucien的老师进入到地址为0x100105ff0的教室,这个教室的门牌号为classroom001,classroom001的地址为0x7fff5fbff7e8
2016-04-15 09:36:21.790 FirstProject[678:9822] 名字叫Lucien的讲师从0x100105ff0的教室里面离开
2016-04-15 09:36:21.790 FirstProject[678:9822] 一个叫Lucien的老师从地址为0x100105ff0的教室离开后,教室的地址并不会因为Lucien离开而改变,这个教室的门牌号仍然为classroom001,classroom001的地址仍然为0x7fff5fbff7e8
2016-04-15 09:36:21.790 FirstProject[678:9822] 一个叫Steven的老师进入到地址为0x100105ff0的教室,这个教室的门牌号为classroom002,classroom002的地址为0x7fff5fbff7e0
2016-04-15 09:36:21.790 FirstProject[678:9822] 名字叫Steven的讲师从0x100105ff0的教室里面离开
2016-04-15 09:36:21.790 FirstProject[678:9822] 一个叫Steven的老师从地址为0x100105ff0的教室离开后,教室的地址并不会因为Steven离开而改变,这个教室的门牌号仍然为classroom002,classroom002的地址仍然为0x7fff5fbff7e0
2016-04-15 09:36:21.790 FirstProject[678:9822] 一个叫David的老师进入到地址为0x1004000d0的教室,这个教室的门牌号为classroom003,classroom003的地址为0x7fff5fbff7d8
2016-04-15 09:36:21.790 FirstProject[678:9822] 名字叫David的讲师从0x1004000d0的教室里面离开
2016-04-15 09:36:21.790 FirstProject[678:9822] 一个叫David的老师从地址为0x1004000d0的教室离开后,教室的地址并不会因为David离开而改变,这个教室的门牌号仍然为classroom003,classroom003的地址仍然为0x7fff5fbff7d8
Program ended with exit code: 0
*/
}
return 0;
}
Lecturer *classroom001 = [[Lecturer alloc] initWithName:@"Lucien];
对不起,classroom001不是对象,它只是一个指针。