10.面向对象
①优点:
1)大幅提高软件项目的成功率;
2)减少维护费;
3)提高可移植性和可靠性;
②面向对象设计三个主要特征:
1)封装性;
2)多态性;
3)继承性;
③区别:
面向过程:
1)强调的是功能行为;
2)关注的是解决问题需要哪些步骤;
面向对象:
1)将功能封装进对象,强调具备了功能的对象;
2)关注的是解决问题需要哪些对象;
3)面向对象时基于面向过程的
11.类(class)
类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。类产生对象的过程叫做“实例化”,一个类可以实例化对个对象。
①组成:一个类由3个部分构成
1)类的名称:类名
2)类的属性:一组包含数据的属性
3)类的方法:允许堆属性中包含的数据进行操作的方法
②类的声明
.h:类额声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。
注意:.h中的方法只是做一个声明,并不对方法进行实现。
.m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。
③类的具体声明:
@interface 类名:父类名
{
//定义类的属性
}
//类的行为
@end
④类的实现
@implementation Car
//方法的具体实现
-(void)run{
}
@end
12.对象(object)
即指现实世界中各种各样的实体,是系统中的基本运行实体。对象就是类类型的变量。类产生对象的过程叫做“实例化”,一个类可以实例化对个对象。
一个类就是具有相同类型的对象的抽象。
①创建对象:
Car *p = [Car new];
//理解1:Car指针变量指向新申请的内存空间
//理解2:用Car类实例化了一个Car类型的实例对象,对象的名称是p
[Car new];
//做了三件事情:
1)向计算机申请内存空间;
2)给类中的每一个成员初始化值;
3)返回新申请的空间的首地址;
13.消息
消息是指对象间相互联系和相互作用的方式。一个消息主要由5部分组成:发送消息的对象、接受消息的对象、消息传递办法、消息内容(参数)、反馈。
14.方法
方法的声明和实现,都必须以“+”或者“-”开头。
"+"表示类方法(静态方法)
"-"表示对象方法(动态方法)
在.h中声明的所有方法作用域都是public类型,不能更改。
①无参无返回值方法的声明:
-(返回类型)方法名{
}
②无参对象方法的调用:
[Car1 run]; //用Car1对象调用了run方法
③有参方法的声明:
-(返回值)方法名1:(参数类型) 参数名; //有一个参数的方法
-(返回值)方法名1:(参数类型1) 参数名1 and:(参数类型2) 参数名2; //有2个参数的方法
④有参方法的调用:
[对象 方法名1:参数1 方法名2:参数2];
如:[c1 sum:11 and:22];
15.成员变量(实例变量/属性)
成员变量的常用作用域有3种:
@public 全局都可以访问;
@protected 只能在类内部和子类中访问;
@private 只能在类内部访问;
16.内存分配
①当使用一个类创建多个对象的时候,注意:
不同的对象在内存中分配的时不同的存储地址,所以各成员属性的地址也各不相同;
17.#pragma mark
功能:简单来说就是对代码的分组,方便代码查找和导航用的。
#pragma mark - :分割一条实线
18.函数和对象方法的区别
①对象方法:-(void)run;
1)对象方法实现只能写在@implementation...@end中,对象方法的声明只能写在@interface...@end中间;
2)对象方法都以-号开头,类方法都以+号开头;
3)对象方法只能由对象来调用,类方法只能由类来调用,不能当做函数一样调用;
4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在@interface...@end会无法识别,函数的声明可以再main函数内部也可以咋main函数外部;
5)对象方法归类\对象所有;
②函数:
1)所有的函数都是平行的;
2)函数不存在隶属关系;
3)使用的时候可以直接调用;
4)不可以访问对象中的成员变量;
19.结构体作为属性赋值
typedef struct{
int year;
int month;
int day;
}MyDate;
#pragma mark Student类的声明
@interface Student:NSObject
{
@public
NSString *_name;
MyDate _birthday;
}
@end
Student *stu1 = [Student new];
stu1->_name = @"dandan";
//第一种赋值
stu1->_birthday = (MyDate){1994,11,7};
//第二种赋值
MyDate date1 = {1994,11,7};
stu1->_birthday = date1;