1、OC简介
Objective-C 继承自C和smalltalk 最小程度增加了面向对象的部分,是一门面向对象编程语言
1986. Next 得到授权
2、OC HelloWorld OC的文件有哪几种?
.h 头文件(声明类)
.m OC源文件(类的实现)
#import <Foundation/Foundation.h> //导入文件
//main函数是OC得主入口函数
int main(){
NSLog(@"Hello World!");
return 0; }
1)NSLog的使用
NSLog() 特点:
1)OC中的日志输出函数,
2)自动换行
3)带有时间戳
4)输出OC的特有的类型 %@(NSString)
5)在使用NSLog的时候,在格式控制字符串的末尾加上一个\n是不起作用
2)@符号的使用
1)@"" 表示OC中的字符串
2)@特殊单词 OC的关键字
3)NS 前缀的说明
NextStep --> Next Software
3、OC对比C快速入门
1) 源文件的差异
2)数据类型
block 块 id 万能指针
BOOL YES/NO 1/0
SEL 选择器
Boolean 布尔类型 true/false 1/0 nil
@try{
//可能出错的代码
}@catch{
//出错后怎么办
}
@finally{
//不管你错不错,都要执行
}
1-【理解】知识回顾
分区oc基础第二天(@传智播客-秦安) 的第1 页
}
3)关键字和标示符
@xxx
4)语句结构(分支和循环)
for(NSString *str in arr){
oc 增强型for循环 forin(快速枚举)
str 每次存放的值是不一样的
}
5)函数对比
C 函数:功能相对独立的代码段
void test(int x){
}
OC 方法:功能相对独立的代码段
@interface Person:NSObject
{
@public
NSString *_name;
int _age;
}
-(void)eat:(NSString *)foodname andfoodCount:(int)num;
@end
@implementation Person
-(void)eat:(NSString *)foodname andfoodCount:(int)num{
}
@end
类名*对象名= [类名new];
类名*对象名= [[类名alloc]init];
Person *pp = [Person new];
[pp eat];
1)对象方法 -开头
对象调用
-(返回值类型) 方法名;
-(返回值类型) xxx:(参数类型) 形参名;
对于有参数的方法来说,方法名是:"xxx:"
-(返回值类型) xxx:(参数类型) 形参名 andAAA:(数据类型) aaa;
对于有参数的方法来说,方法名是:"xxx: andAAA:" 2)类方法
+ 开头 类名取调用
6)逻辑类型
BOOL / Boolean
4、面向对象编程
面向对象是面向过程而言面向对象是基于面向过程面向对象和面向过程,都是一种编程思想
面向对象: 首先是把功能封装到对象中
分区oc基础第二天(@传智播客-秦安) 的第2 页
面向对象: 首先是把功能封装到对象中 完成一个事情,需要多少个对象来做
面向过程: 完成一件事情,需要哪些步骤
类和对象
类:一类事物的特征和行为的抽象对象:满足类的特征的一个个体
一个类可以创建多个对象
类的提取 名词提炼法
类的创建步骤:
1)类名
2)类的属性(实例变量、成员变量)
3)行为(方法)
5、第一个OC类
类的使用:1)声明一个类 2)实现一个类
类的声明:(定义属性和声明方法)
@interface 类名 : 父类名
{
//类的属性的定义
}
//类的方法声明
@end
类的实现:(方法的实现)
@implementation 类名 @end
对象方法的定义:
-(返回值类型) 方法名;
-(返回值类型) xxx:(参数类型) 形参名; 对于有参数的方法来说,方法名是:"xxx:"
-(返回值类型) xxx:(参数类型) 形参名 andXXX:(参数类型) 形参名; 方法名: xxx: andXXX:
[对象名 xxx:实参1 andXXX:实参2];
方法的调用
[对象名 方法名]; //调用无参方法
[对象名 方法名:实参];
************* 今天内容提要 *************
分区oc基础第二天(@传智播客-秦安) 的第3 页
分区oc基础第二天(@传智播客-秦安) 的第4 页
本小节知识点:
1、【理解】对象的存储细节
2、【掌握】使用一个类创建多个对象
1、对象的存储细节
int a = 10; 4个字节 内存栈区
Person *p = [Person new];
//1) 申请一块内存空间,在堆区
// 2) 初始化实例变量
// 3) 返回对象的首地址
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有一份属于自己的单独 的成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身在内存中占据 一份存储空间,类的方法存储于此。
给对象的属性赋值和调用方法的过程
每一个对象都包含一个isa指针.这个指针指向当前对象所属的类。
[p eat];
表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象
2-【掌握】对象的存储细节
分区oc基础第二天(@传智播客-秦安) 的第5 页
表示给p所指向的对象发送一条eat消息,调用对象的eat方法,此时对象会顺着内部的 isa指针找到存储于类中的方法,执行。
isa是对象中的隐藏指针,指向创建这个对象的类
在OC中存在一个名为id的类型,这个和上面所说这个isa指针有一定的联系.
C代码
typedef struct objc_object {
Class isa;
} *id;
其中Class类型为指向objc_class结构体的指针类型. 这些对象在内存中都是由其地址唯一标示,所有的对象都是id类型的.
2、使用一个类创建多个对象
Car *car2 = [Car new];
Car *car3 = [Car new] ;
当使用一个类创建多个对象的时候,注意:
1)不同的对象在内存中分配的是不同的存储地址,所以各成员属性的地址也各不相同 Car *car = [Car new];
分区oc基础第二天(@传智播客-秦安) 的第6 页
各不相同 Car *car = [Car new];
分区oc基础第二天(@传智播客-秦安) 的第7 页
本小节知识点:
1、【了解】#pragma mark指令的使用
1、#pragma mark指令的使用
功能:简单来说就是对代码的分组,方便代码查找和导航用的 它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开。
一些类(尤其是一些控制器类)可能很长,方法和函数弹出菜单可以便于代码导航。此时加入#pragma 指令 (#pragma是一个编译指令)对代码进行逻辑组织很有效果。
一个类里我们总会有一些方法的功能与性质是相差不多的,你可能会有把方法们分组的想 法。Xcode已经有了类似的支持,它就是 #pragma mark。
1)第一种用法:分隔线
#pragma mark -
3-【了解】#pragma mark指令的使用
分区oc基础第二天(@传智播客-秦安) 的第8 页
上述功能还可以这样写成一行
2)第一种用法:#pragma mark 分组(标识)名称
注意
1)#pragma mark –的“-”后面不能有空格。
分区oc基础第二天(@传智播客-秦安) 的第9 页
本小节知识点:
1、【理解】函数和对象方法的区别
1、函数和对象方法的区别
对象方法:
(1)对象方法的实现只能写在@implementation...@end中,对象方法的声明只能写在 @interface...@end中间
(2)对象方法都以-号开头,类方法都以+号开头
(3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用
(4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,编译失败,函数的声明可以在main函数内部也可以在main函数外 部。
(5)对象方法归对象所有
在类的实现中定义函数
4-【理解】函数和对象方法的区别
分区oc基础第二天(@传智播客-秦安) 的第10 页
在类的实现中定义函数
函数:
void run(){ }
(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
分区oc基础第二天(@传智播客-秦安) 的第11 页
本小节知识点:
1、【理解】常见的错误
1、常见错误
(1)@interface @end和@implementation @end不能嵌套包含
OC是弱语法,可以只有@implementation,但实际开发中千万不要这样。
(2)只有类的声明没有类的实现
只有@interface没有@implementation时,程序编译不能够通过,执行报错 错误如下:
5-【理解】常见错误汇总
分区oc基础第二天(@传智播客-秦安) 的第12 页
(3)漏写@end
(4)两个类的对象声明顺序(可以把顺序打乱)
(5)实例变量没有写在{}里
(6)方法的声明写在了{}里面
(7)在声明时不能对类的实例变量进行初始化,请注意实例变量不能脱离对象而独立存在
(8)方法无法像函数那样的调用
方法调用:[对象 方法名] 函数:函数名();
(9)类的实现可以写在mian函数后面,在使用之前只要有声明就可以
(10)经典错误:调用了一个不存在的方法
-[Car test]: unrecognized selector sent to instance 0x100206ec0
test方法没有实现
分区oc基础第二天(@传智播客-秦安) 的第13 页
分区oc基础第二天(@传智播客-秦安) 的第14 页
本小节知识点:
1、【掌握】对象作为方法的参数
2、【掌握】对象作为方法的返回值
1、对象作为方法的参数
假设有Person类: Person类有name、sex属性
假设实例化Person的对象
Person *p = [Person new];
p->_name =@"凤姐";
p->_sex = @"女";
获得这个人的所有信息
-(void) displayPerson:(Person *)person{
NSLog("姓名:%@",person->_name);
NSLog("姓名:%@",person->_sex);
}
2、对象做方法的返回值
6-【掌握】对象和方法之间的关系
分区oc基础第二天(@传智播客-秦安) 的第15 页
2、对象做方法的返回值
-(Person *)changePerson:(Person *)person{
person->name = @"唐僧";
person->sex =@"男";
person->age = person->age+1;
return person;}
Person *p2 = [d changePerson:p1];
[d displayPerson:p2];
分区oc基础第二天(@传智播客-秦安) 的第16 页
思考&实现1:
设计一个”狗“类
1> 属性
* 颜色
* 速度(单位是m/s)
* 性别
* 体重(单位是kg)
2> 行为
* 吃:每吃一次,体重增加0.5kg,输出吃完后的体重
* 吠(叫):输出所有的属性
* 跑:每吃一次,体重减少0.5kg,输出速度和跑完后的体重
* 比较颜色:跟别的狗比较颜色,如果一样,两个值做减法得零,返回NO(零值),不一样,
做减法得到非零值,返回YES(1) _color -dog->_color
* 比较速度:跟别的狗比较速度,返回速度差(自己的速度 -其他狗的速度)
_speed -dog->_speed
7-【理解】练习题讲解(一)-1
分区oc基础第二天(@传智播客-秦安) 的第17 页
2.结合前面的“狗”类,设计一个“人”类
1> 属性
* 姓名
* 狗(养了一条狗)
2> 行为
* 喂狗:每喂一次,狗就会执行“吃”这个行为 * 遛狗:每溜一次,狗就会执行“跑”这个行为
8-【理解】练习题讲解(一)-2
分区oc基础第二天(@传智播客-秦安) 的第18 页
本小节知识点:
1、【理解】对象作为方法的参数连续传递
1、对象作为方法的参数连续传递
实现功能:士兵开枪 枪射击子弹
枪类:
名称:Gun
属性:型号(_size),子弹个数(_bulletCount)
行为:射击
士兵类
名称:Soldier
属性:姓名(_name) lifelevel(等级)
行为:开枪
9-【理解】对象作为方法的参数连续传递1
分区oc基础第二天(@传智播客-秦安) 的第19 页
本小节知识点:
1、【理解】对象作为方法的参数连续传递
1、对象作为方法的参数连续传递
实现功能:士兵开枪 枪射击子弹 子弹个数为负数的bug修复
10-【理解】对象作为方法的参数连续传递2
分区oc基础第二天(@传智播客-秦安) 的第20 页
本小节知识点:
1、【理解】对象作为方法的参数连续传递
1、对象作为方法的参数连续传递
实现功能:士兵开枪 枪射击子弹
枪 弹夹 --->人
人--->开火 , 子弹上膛,再开始抢
子弹类
名称:Bullet
属性:子弹个数,型号(_model)
11-【理解】对象作为方法的参数连续传递3
分区oc基础第二天(@传智播客-秦安) 的第21 页
思考&实现1: 设计一个”学生“类
1> 属性 * 姓名 * 生日
用结构体作为类的实例变量(生日)
#import <Foundation/Foundation.h> //定义生日的结构体
typedef struct{
int year;int month;int day;
}MyDate;
@interface Person : NSObject {
@public
NSString *_name;//定义姓名
MyDate _birthday;//定义生日
}
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
p->_name = @"sb"; //因为结构体已经初始化为0了,在次初始化就报错了,但是可以逐个赋值。
//p->_birthday = {1990,12,3};
p->_birthday.year = 2014; p->_birthday.month = 05; p->_birthday.day = 12;
NSLog(@"%@的生日是:%d年%d月%d 日",p->_name,p->_birthday.year,p->_birthday.month,p->_birthday.day);
//也可以整体赋值
MyDate de={1993,11,11};
12-【理解】练习题讲解(二)
分区oc基础第二天(@传智播客-秦安) 的第22 页
MyDate de={1993,11,11}; p->_birthday = de;
NSLog(@"%@的生日是:%d年%d月%d 日",p->_name,p->_birthday.year,p->_birthday.month,p->_birthday.day);
}
return 0; }
内存分析:
分区oc基础第二天(@传智播客-秦安) 的第23 页
本小节知识点:
1、【掌握】NSString常见方法
NSString是 Objective-C 中核心处理字符串的类之一。
1、NSString常见方法
1)创建常量字符串,注意使用“@“符号。
NSString *astring = @"This is a String!";
2)创建空字符串,给予赋值。
3)创建格式化字符串:占位符(由一个%加一个字符组成)
4)使用NSLog是不能打印c中的中文字符串的 英文字符串可以打印出来
char *str = "传智播客"; NSLog(@"%s",str);
13-【掌握】NSString 类介绍及用法
分区oc基础第二天(@传智播客-秦安) 的第24 页
本小节知识点:
1、【掌握】NSString字符串长度计算
1、NSString字符串长度计算
char *s = "abc"
strlen()
通过调用NSString类的对象方法 length 可以获得字符串的长度
1)纯英文字符
2)中英文混合
3)纯中文
14-【掌握】NSString 字符串长度计算方法
分区oc基础第二天(@传智播客-秦安) 的第25 页
3)纯中文
注意: 在C语言中,每个汉字占用3个字节,可以使用strlen计算。
分区oc基础第二天(@传智播客-秦安) 的第26 页
本小节知识点:
1、【了解】为什么要使用多文件
1、为什么要使用多文件?
思考:C语言中讲过多文件开发,多文件开发有什么好处?
oc中也有多文件开发,那么和c语言中的多文件开发有什么不同呢?
在工作中,通常把不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h头文件 中,实现写在相应的.m文件中去,类名是什么,文件名的前缀就是什么。 假设有两个类,分别是Person类和Dog类,则通常有下面五个文件:
(1)Person.h Person类的声明文件
(2)Person.m Person类的实现文件
(3)Dog.h Dog类的声明文件
(4)Dog.m Dog类的实现文件
(5)Main.m 主函数(程序入口) 在主函数以及类的实现文件中要使用#import包含相应的头文件。
补充:import有两个作用:一是和include一样,完完全全的拷贝文件的内容;二是可以自动防止 文件内容的重复拷贝(即使文件被多次包含,也只拷贝一份)。 在使用命令行进行编译链接文件的时候,通常是把.m文件单文件编译,然后再把所有的目标文件 链接,但是在Xcode中,是把所有的.m文件都进行编译链接的,如果出现重复定义的错误,那大部 分问题根源应该就是文件内容被重复包含或者是包含.m文件所引起的。 源文件中不论是使用include还是import,都不能包含.m或者是.c文件,只能放声明。因此,在OC 中通常把类拆分开来,拆分成声明和实现两个部分。
提示:这也是编程思想的一种体现,可以说.h和.m文件时完全独立的,只是为了要求有较好的可 读性,才要求两个文件的文件名一致,这也是把接口和实现分离,让调用者不必去关心具体的实 现细节。 Xcode是写一行编译一行,有简单的修复功能,红色是错误提示,黄色警告。如果在程序中声明了 一个变量,但是这个变量没有被使用也会产生警告信息。在调试程序的时候,如果发现整个页面 都没有报错,但是一运行就错误,那么一定是链接报错。
15-【了解】OC多文件开发介绍
分区oc基础第二天(@传智播客-秦安) 的第27 页
本小节知识点:
1、【掌握】多文件实现的步骤
1、多文件实现的步骤
在OC中一个类含有.h(类的声明) 和 .m(类的实现)文件,我们可以有多种方式创建类文件。
第一种:先创建.h文件,再创建.m文件,这种创建方式非常类似于C语言多文件开发的步骤
1)创建类的声明文件(.h的文件)
i.创建新的文件
ii.创建OC类声明文件
16-【掌握】多文件实现步骤
分区oc基础第二天(@传智播客-秦安) 的第28 页
ii.创建OC类声明文件
Iii.选择保存的位置
创建即可。
2)创建类的实现文件(.m的文件)
创建文件
分区oc基础第二天(@传智播客-秦安) 的第29 页
i. 选择OC类文件
ii.填写文件名
分区oc基础第二天(@传智播客-秦安) 的第30 页
点击Next 创建即可。
也可以使用如下方法,快速创建.h和.m文件
分区oc基础第二天(@传智播客-秦安) 的第31 页
多文件开发中 常见的一个错误 类文件没有参与编译:
分区oc基础第二天(@传智播客-秦安) 的第32 页
************* 今天内容总结*************
o
17-【了解】内容总结
分区oc基础第二天(@传智播客-秦安) 的第33 页