/*
1. 源文件后缀名
C程序的源文件的后缀名为.c
OC程序的源文件的后缀名为.m message. 消息机制.
OC是完全兼容C语言的. 所以在.m文件之中是可以写任意的C代码的
.m文件中. 可以写OC代码、C代码、C++代码.
2. main函数仍然是OC程序的入口和出口.
返回值代表程序的结束状态.
参数可以接收用户的数据.
也可以不带参数.
3. #import指令.
1). 这是1个预处理指令. 会在编译之前执行.
2). 作用: 是#inlcude指令的增强版.
在预编译的时候,将后面的文件的内容拷贝到写指令的地方.
3). 增强: 同1个文件无论import多少次,都只会包含1次.
4). 如果要使用#Inlcude指令来实现这个效果的话 就会比较麻烦了.
必须要配合#ifndef指令来实现.
5). #import指令的原理: 在包含1个文件的时候. 底层会先判断这个文件是否被包含.
如果被包含就会掠过 如果没有包含才会包含.
不需要使用条件编译指令.
6). import指令的用法
#import "路径" 先找当前源文件所在的目录 没有再去Xcode编译器目录之中查找.
#import <路径> 直接找Xcode编译器目录.
如果是我们自己的文件.别乱放 是放在当前源文件所在的目录下.
"" 包含自己的文件
<> 包含系统的文件.
4. 框架
苹果或者第三方事先将一些牛X(常用)的功能写好. 把这些功能模块封装在1个1个类之中.
把这些功能提供给大家用. 这些类的集合就叫做框架.
框架说白了就是1个功能集合. 这些功能是苹果或者其他高手写的.我们要用直接调用就可以了.
相当于C语言中的函数库. Location.......
Foundation框架:
提供了一些OC最基础的功能. 数据类型的支持、输入输出.....
Foundation.h的地址:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Foundation.framework/Headers
Foundation.h这个文件中包含了所有的Foundation框架中的头文件.
所以,我们只要包含这个头文件 就相当于将所有的Foundation框架中的头文件都包含了.
所以,我们这么一写 就可以直接使用Foundation框架中的所有的东西了.
5. @autoreleasepool 这是1个自动释放池
1) 可以将代码直接写在池子之中.
2) 也可以删除 目前为止不会有影响.
6. NSLog函数.
1). 是printf函数的增强版.
2). 作用: 向控制台输出信息.
3). 增强的地方.
a. 自动换行,不需要去追加'\n' NSLog函数在输出完毕信息之后 会自动的换行.
b. 在输出信息的同时 还会输出一些与程序有关的其他信息.
-> 显示执行这句代码的时间 具体到毫秒.
-> 显示这句代码是由那1个程序来执行的.
-> 程序运行的时候的进程ID PID
-> 线程ID。
-> 最后面才是我们输出的信息.
4).printf支持使用格式控制符.NSLog函数支持printf函数的全部的格式控制符 并且使用方法都是一样的.
5).注意
a. NSLog函数的字符串参数前面必须要加1个@符号.
b. NSLog函数默认会在输出完毕信息之后换行.
如果我们在字符串的后面手动的加了'\n' 这个时候NSLog函数的自动换行就会失效.
6).从今以后, 忘记printf函数 使用NSLog函数.
7. OC中的字符串.
1). C语言的字符串的存储方式.
a. 使用字符数组来存储
char str[] = "jack";
b. 使用字符指针来保存存储在常量区字符串的地址.
char *str = "rose";
2).OC中专门的设计了1个新的类型来保存字符串。对应我们而言无需关心内部是如何实现的.
设计了1个NSString类型的指针变量.用这个指针变量来保存字符串的地址.
OC中的字符串常量必须加1个前缀@符号.
@"jack" @"rose" @"北京我爱你" 是OC的字符串.
"@jack" 这是C语言的字符串. OC的字符串常量的@符号是写在双引号外面的.
"jack""rose" "北京欧你还敢" 这是C语言的字符串.
OC的字符串常量使用NSString类型的指针变量来保存地址.
3). NSString类型的指针变量只能保存OC字符串。为其赋的字符串必须加前缀@符号.
不能保存C语言的字符串.
4). 使用%@格式控制符 输出 NSString 类型的字符串.
5). NSLog函数的第1个参数是1个NSString类型的 所以字符串只能给1个OC字符串,不能给1个C语言字符串.
8. NS前缀
1). NextStep -->Cocoa 实际上是NeXT公司开发的.
为了区分这些东西的前身是NextStep 就为他们家了1个前缀NS
9. @符号.
1). 将C语言的字符串转换为OC的字符串.
"jack"
@"jack"
2). OC中新增的关键字绝多部分都是以@开头.
@autoreleasepool
@interface
@implementation
@public
@protected
.........
10. 注释
与C语言一模一样.
11. 函数的定义与调用.
与C语言一模一样.
*/
/*
1. OC程序的编译.
它的编译、连接、执行和C程序是相差无几的.
1). 在.m文件中写上符合OC语法规范的源代码.
2). 使用 cc -c 指令来编译我们的文件.
a. 预处理.
b. 检查语法
c. 生成.o的目标文件.
3). 链接
cc xx.o
a. 添加启动代码.
b. 链接函数. 将要调用的函数的实现拷贝进来
在代码中如果使用到了框架中的功能 就必须要指定系统到那1个框架中去找.
cc main.o -framework Foundation
4). 链接完毕之后 会生成1个a.out可以执行文件 一样可以执行.
2. OC程序各个阶段的后缀名.
C OC
源文件 .c .m
目标文件 .o .o
可执行文件 .out .out
3. OC的数据类型.
1). OC支持C语言中的所有的数据类型.
基本数据类型: int float double char
构造类型: 数组 结构体 枚举
指针:
void
typedef 定义类型.
2). OC在此基础之上新增了一些数据类型.
a. BOOL类型. 可以存储YES和NO 之中的任意1个数据.
一般情况下,使用它来保存1个条件表达式的结果.
YES代表条件成立 NO代表条件不成立.
BOOL的本质: 是1个有符号的char变量. YES实际上1 NO实际上是0.
输出的话.只能以整型输出.
b. Boolean类型. 可以存储true或者false
代表1个条件的真假. 用来保存1个条件表达式的结果.
本质: 无符号的char变量.
true 1
flase 0.
c. id类型. 万能指针. 谁都可以指.
d. class 类.
e. SEL 方法包装器.
f. nil 与 NULL 差不多.
g. block 代码块.
4. OC支持C语言中的所有的运算符.没有新增.
赋值运算符. =
算术运算符 + - * / %
复合赋值运算符 +=
自增自减 ++ --
关系运算符 > >= .....
逻辑运算符 && || !
取地址运算符 &
*
........
5. 控制语句.
OC支持C的所有的控制语句.
if
switch-case
while
do-while
for
数组
指针
函数
.......
全部都被OC支持
6. OC支持C的所有的关键字. 并且效果一直.
OC还新增了一些关键字. OC新增的关键字绝大部分以@开头.
7. 函数定义和调研 一样.
OC是完全兼容C语言. 在OC中可以写任意的C代码 并且效果和C的一样.
*/
/*
1. OC将C的复杂的东西简单
a. #import 指令.
b. NSLog函数.
c. NSString
d. BOOL
2. OC在C的基础之上增加了一些面向对象的语法.
面向过程 面向对象. 是解决问题的不同的思路.
1). 将大象放进冰箱.
a. 打开冰箱门.
b. 把大象放进冰箱
c. 把冰箱门关上.
面向对象.
找到1个冰箱. 只要这个冰箱有自动开门 自动拉近大象 自动关门.
2). 买电脑的需求
a. 根据自己的预算和需求确定型号. 查找资料.
b, rMBP 9288
c, 到岗顶.
d. 找到Apple的专门店.
e. 砍价 成交.
f. 愉快的完成交易.
强调的是: 步骤,实现这个需求的过程, 每1个步骤都是由我们自己来亲自完成.
如果每1个步骤都是自己去做的话,那么自己就会不专业 就会出纰漏.
对于我而言,我是1个彻头彻尾的执行者.
思考中间会出现的问题.
如何保证买电脑的需求是完美的完成 绝对不会被骗.
买电脑的第二种方式.
找1个电脑高手.
对于我而言 我只需要带上钱和电脑高手就可以了. 剩下的所有的事情电脑高手帮我们做.
绝对不会被骗的.
强调: 电脑高手. 所有的事情都是由这个专业的人来干.它肯定能干好.
对于我而言.我是1个扬眉吐气的 指挥者.
买电脑我们有两种方式. 我们都选择第2种 为什么不选第1种呢?
3). 面向过程实际上是一种解决问题的思路.
在遇到1个需求的时候. 每1个步骤都是由我自己去亲自做 这种解决问题的思路我们就叫做面向过程的解决方案.
面向对象也是解决问题的另外一种思路.
在遇到1个需求的时候. 自己不做,而是去找1个专门做这个事情的人来帮助我做,这种解决问题的思路我们就叫做面向对象.
4). 无论是面向过程还是面向对象 都是解决问题的思路.
无论那1种思路其实归根究底都可以完成这个需求
但是要思路那一种思路是最好的.
3. 代码中的面向过程与面向对象.
比如,要将1个数组进行排序.
使用冒泡排序算法来亲自排序.
这种解决的方式就叫做面向过程的.
面向对象的方式: 找1个专门做排序的人来帮助我们排.
C语言是1门面向过程的语言.
面向过程:在遇到1个需求的时候.每1个步骤都自己亲自去做.自己亲自去实现. 这种方式叫做面向过程.
面向对象:在遇到1个需求的时候. 不要自己去实现 而是找1个专门做这个事情的人来帮助我们做
*/
/*
1. 在代码中如何使用面向对象的思维去解决问题.
a. 千万不要自己去1步步实现.
b. 先找1下有没有现成的专门做这个事情的人. 框架。
如果框架中有这样的人 直接喊过来用就可以了.
c. 框架中如果没有呢? 就自己造1个拥有这个功能的人.
这个人不仅在这个地方可以使用 在另外的地方也可以使用.
2. 面向对象相对于面向过程.
面向对象的优点: 后期程序的维护和扩展非常的方便. 如果功能发生变化 我们只需要换1个人就可以了.
OC Swift Java C# ......
面向过程优点: 与底层的交互效率很高.
C
3. 类和对象.
1). 什么是对象
对象是现实生活中的具体存在.
特点:看得见、摸的着 拿来就可以用.
2). 什么是类
物以类聚 人以群分.
类是对1群具有相同特征、行为的事物的统称.
特点:抽象,无法直接使用.
人. 不是单独指1个个体. 而是指1群.
学生. 是1个人并且具有学习的行为.
无法直接使用类 因为类是1个统称.
如果你非要用. 就必须要找到这群事物中的1个具体的存在.
3). 食物.
水果.
苹果.
红富士苹果.
4). 交通工具.
车.
汽车
奔驰汽车
奔驰汽车CLS350
4. 类与对象的关系
类是模板,对象是根据这个模板创建出来的.模板中有什么 对象中就有什么 不会多也不会少.
类是制造月饼的模子, 所以类不能使用. 所以模子是不能吃的.
对象是根据这个模子制造出来的月饼. 模子上有什么 月饼上就有什么 绝不可能多 也不可能少.
对象是可以直接使用的. 月饼是可以吃的.
只要有1个制造月饼的模子 就可以根据这个模子做很多很多的月饼出来.
只要有1个类模板 那么我们就可以创建很多很多个对象.
5. 如何设计1个类.
最要的三点:
-> 这个类叫做什么名字. 你要描述的这类事物叫做什么
-> 这类事物具有的相同的特征.
-> 这类事物具有的相同的行为
人
特征: 姓名 年龄 身高 体重 性别
行为: 吃饭 睡觉 走路
空调:
特征: 品牌 颜色 尺寸 功率 匹数 重量...
行为: 放冷气 放热气
6. 如何找到类: 名词提炼法.
分析这个需求中,出现了哪些名词 这些名词就是类. 然后再分析类的三要素.
3辆坦克发射了6枚炮弹打中了2架飞机.
坦克类
特征: 型号 大小 攻击能力. 颜色...
行为: 行驶 发射炮弹
炮弹类
特征: 型号 威力 .....
行为: 飞行 爆炸
飞机类
特征: 型号 大小 座位数量....
行为: 飞行 爆炸.
小明在公交车上牵着1条叼着热狗的狗.
人类
特征: 姓名 年龄....
行为: 遛狗
公交车
特征: 型号 座位数量....
行为: 行驶...
热狗
特征: 味道. 大小.....
行为: 散发味道.
狗.
特征: 颜色 品种...
行为: 叼热狗.
7. 设计1个类.最重要的是类的三要素.
类名:
特征:
行为:
8. 是先有类 还是有先对象.
从现实的角度: 一定是先有对象才有类
从代码的角度: 一定是先类再有对象.
代码之中:
先创建类模板. 然后才可以根据这个模板创建出对象来使用.
使用类描述1群事物 然后通过类模板再创建对象.
9. 如何定义类
1). 类是干嘛的? 描述一群具有相同特征和行为的事物的.
2). 定义类分为两个部分.
a. 类的声明.
@interface 类名 : NSObject
{
写上这类事物具有的共同的特征;
}
写上这类事物具有的共同的行为的声明.
@end
b. 类的实现.
@implementation 类名
写上这类事物具有的共同的行为的实现.
@end
c. 具体做法.
将这类事物具有的相同的特征定义为变量 定义在声明类的大括弧之中.
d. 定义类的规范.
-> 类名的每1个单词的首字母大写.
-> 表示这类事物具有的共同的特征的变量名 必须使用 下划线开头.
10. 创建对象.
1). 类是无法直接使用的. 如果非要使用的话.就必须找到这个类中的1个具体的存在.
2). 这个具体存在就有这个类定义的所有的成员.
3). 如何创建类的对象呢?
类名 *对象名 = [类名 new];
Person *p1 = [Person new];
表示创建了1个对象.对象名叫做p1.
p1对象是根据Person模板创建的.
所以
-> p1对象中有 Person模板中定义的所有的东西.
-> p1是个对象 所以我们可以直接使用p1。
4). 用来描述这类事物的共同特征的变量.
叫做 成员变量、实例变量、字段、属性.
11. 访问对象的成员
a. 默认情况下 对象中的成员外界是没有权限访问的.
如果外界想访问那么就在类的字段的上面写1个@public关键字.
b. 访问对象的成员的语法
对象名 -> 成员名 = 数据;
(*对象名).成员名;
12. 请定义1个学生类.
属性: 姓名 年龄 学号 成绩.
定义类 然后创建对象. 并为对象的属性赋值.
最后将对象的各个属性的值输出.
13. 再次的聊几个问题
1). 类是用来干嘛的?
用来描述一群具有相同特征和行为的事物的.
14. 注意的几个问题
1). 找准位置. 类的声明和实现都直接在源文件之中 不应该写在函数内部.
2). 类名的每1个单词的首字母大写.
3). NSObject 是什么意思 不需要管. 类名和NSObject中间是用冒号隔开的.
4). 用来描述这类事物的共同特征的实例变量应该写在类的声明的大括弧之中.
5). 实例变量名必须要以下划线开头.
6). 类分为两部分 缺一不可 分为声明和实现.
@interface是声明
@implementation 是实现.
7). 无论是声明还是实现 @end必不可少.
8). 类的实现必须要在类的声明后面
9). 如果发现通过对象名 箭头 出来的成员被删除线 那么就说明没有写@public
15.
*/
/*
1. 如何为类定义行为.
刚刚我们聊的是如何为类定义特征.
如何定义行为? 行为就事1个功能 也就事1个函数.
OC中把行为叫做方法. 实际上和函数是一样的 代表1个功能模块.
2. 为类定义无参数的方法.
类的方法也分为两个部分.
a. 方法的声明
1). 位置: 写在声明类的大括弧的外边.
2). 声明的语法:
- (返回值类型)方法名;
- (void)sayHi;
这个方法的名字就叫做sayHi;
b. 方法的实现.
1). 位置: 写在类的实现之中.
2). 实现的语法:
- (返回值类型)方法名
{
方法体;
}
c.方法的调用.
定义在类中的方法是属于类的. 而类是无法直接使用的.
所以,这个定义在类中的方法是无法直接调用的.
如果非要调的话.就得创建1个类的对象.
那么这个对象之中就拥有类模板中的所以的成员 实例变量、方法.
就可以通过对象来调用这个对象的方法.
调用语法:
[对象名 方法名];
[p1 sayHi];
3. 带1个参数的方法的声明和实现.
a. 方法的声明
1). 位置:
2). 语法:
- (返回值类型)方法名:(参数类型)参数名称;
- (void)eat:(NSString *)foodName;
需要牢牢的记住一点:
这个方法的名字叫做 eat:
b. 方法的实现:
1). 位置.
2). 语法
将声明拷贝过来 去掉分号 加对大括弧 将实现写在其中就可以了.
- (返回值类型)方法名:(参数类型)参数名称
{
}
c. 方法的调用
1). 要通过对象名来调用.
2). 调用语法
[对象名 方法名:实参];
4). 带多个参数的方法
a. 声明:
1).位置.
2).语法
- (返回值类型)方法名:(参数类型)参数名称 :(参数类型)参数名称 :(参数类型)参数名称;
- (int)getSum:(int)num1 :(int)num2;
这个方法的名字叫做getSum: :
b. 实现:
1). 位置.
2). 语法
拷贝方法的声明,去掉分号 加对大括弧 将实现写在其中就可以了.
- (返回值类型)方法名:(参数类型)参数名称 :(参数类型)参数名称 :(参数类型)参数名称
{
方法的实现.
}
c. 调用
1).必须要通过对象名来调用.
2).调用的语法
[对象名 方法名:实参 :实参 :实参];
3. 带参数的方法名的规范.
1). 遵守的原则. 调用的时候看起来是一句连贯的话.
让调用者知道这个参数的作用是什么.
2). 规范:
如果方法只带1个参数. 那么方法名:
- (返回值类型) 方法名With:(参数类型)参数名称;
如果有多个参数:
- (返回值类型) 方法名WithXX:(参数类型)参数名称 andXX:(参数类型)参数名称;
*/
/*
1. 同1个类可以创建N多个对象.
对象与对象之间是没有影响的.1个对象的熟悉的值是根本不会影响另外1个对象的属性的值的.
同1个类的多个对象之间毫无关系.
唯一的关系 是他们都是根据同1个类模板创建出来
他们具有相同的成员 属性、方法.
属性的值相互之间是不影响的.
2. 在方法的实现之中.可以直接访问这个类的成员变量.
访问的是那1个对象的成员变量呢?
这个方法是通过那1个对象来调用的.那么这个方法中访问的成员变量就事那个对象的.
谁来调用这个方法,这个方法中的成员变量就事谁的.
3. 当我们声明1个对象.如果没有为对象的字段赋值.
这个时候对象的字段是有默认值的.
如果字段的类型是基本数据类型 那么默认值是0.
如果字段的类型是OC指针类型. 那么默认值就是nil
如果字段的类型是C指针类型 那么默认值是NULL
如何声明、实现类
如何创建对象
如何访问对象的成员
方法的声明和实现
如何调用方法.
*/