基本内容:
1.面向对象
"面向对象和面向过程的区别":
面向过程考虑的是实现功能所需要的步骤,每一步都需要自己去手动实现
面向对象考虑的是实现功能需要哪些对象,通过所需要的对象调用对应的方法来实现功能,而具体怎么实现我们不去关心
(举个简单例子,比如造车:面向过程需要自己拆装每一个零件,面向对象只要找会造车的对象就可以了)
2.类和对象
"类"是一类具有相同或相似属性和功能的事物的抽象集合
"对象"是类的具体实例(万物皆对象)
类的组成包括"类的声明":声明"实例变量"和声明"方法",
方法包括"类方法"(以"+"开头只能由类调用的方法)和"对象方法"(以"-"开头只能由对象调用的方法)
"类的实现":实现类中声明的方法
3.类方法和对象方法
类方法只能由类本身调用,不能直接访问类的实例变量
对象方法只能被类的对象调用,可以直接访问类的实例变量
4.匿名对象
仅用来实现对象方法或者作为方法的参数时使用的对象,只能在创建时使用一次,访问类的实例变量无意义
5.实例变量的权限修饰关键字:
@public:实例变量可以被任意类访问,权限公开
@protected:实例变量可以被自身对象方法和对象子类方法访问.对外不可访问
@private:只能在当前类的方法中访问,对子类可见但不可以使用
"私有变量":.m文件中定义和生成的实例变量,只在当前类的对象方法中被使用,对子类不可见 //这一条可以添上,免得被多问起相关问题
-----------------------------"对象与对象的关系"-----------------------
6.面向对象关系----"依赖"
A类的对象作为B类方法的参数或者局部变量,此时称B对象依赖A
举例: Person类: -(void)call:(Phone *)iPhone; //Phone类对象作为Person的方法参数
-(void)call{
Phone *iPhone = [Phone new]; //Phone类对象作为Person的局部变量
}
7.面向对象关系----"关联"
A类的对象作为B类的实例变量,称A和B类具有关联关系
举例: @interface Person:NSObject
{
Phone *iPhone; //Phone类的对象作为Person类的实例变量
}
8.面向对象关系----"继承"
1.子类继承父类,拥有父类的所有属性和方法
2.子类可以定义自己特有的实例变量和方法,并且子类可以重写父类的方法
3.子类调用方法的顺序: 优先调用自身的方法,如果没有,则查找上一级父类.上一级父类没有,继续向上一级查找.直到查找完NSObject仍未找到,则报错
4.OC中的继承都是单继承,即只能继承一个父类,但是可以遵守多个协议
题外话:关于OC中的"方法重载":
方法重载:同名方法拥有不同的参数类型和个数,调用时根据参数类型和个数自动匹配对应方法 //Java中的方法重载
在OC中不存在方法的重载
9.类方法中的self关键字: self:"只有用在类的方法中才有意义",同样的还有super
1.用在类方法中指类本身,用来在类方法中调用其他类方法
2.用在对象方法中指对象本身,用来在对象方法中调用其他对象方法
3.在类方法中修饰实例变量,指类本身的实例变量,而不是方法中的同名参数
10.super关键:在子类中通过super来调用父类的方法
11.私有方法
在类的.m文件中实现,而未在.h文件中声明的方法.只能在类的方法中通过self调用,不能在其他类中访问,包括子类.
12.description方法: NSLog(@"%@....", obj);
用于输出OC对象信息的方法,返回一个NSString字符串,可以自行构造
13.面向对象关系----"多态"
不同对象响应同一消息所表现出来的多种不同形态称作"多态"
多态的"条件":1.有继承关系, 2.有方法的重写
OC中多态的表现形式:'父类指针指向子类的对象',通过父类的指针可以调用子类的方法,经过"指针的强转",还可以访问子类独有的方法,但是不能访问子类对象中没有的方法
14.OC的动态特性:
在编译时不检验对象所属的类型,在运行时才检查对象的实际类型的特性.
具体实现分为:"动态检查","动态绑定","动态加载"
15.id和instancetype区别
id是一个万能指针,可以指向任意的OC对象.id可以用来创建对象指针,也可以用作方法的返回值.但是作为返回值时,编译器不会检查返回对象的类型是否和接收指针类型一致
instancetype也可以指代任意的OC对象,但是instancetype只能用作方法的返回值.作返回值时,编译器会检查返回对象的类型是否和接收指针类型一致.如不一致,则报警告
16.类的本质
类的本质是一个Class类的对象.通过[类名 @class]或者[类对象名 @class]可以获取到这个类的类型
类对象存储在全局区的"数据区",而对象存储在"堆区"
17.SEL类型
OC数据类型之一,将一个OC方法包装成一个数据类型.用法:SEL s1 = @selector run;
18."点语法"的实质
点语法的实质,是将该语法转换为对应的setter/getter方法,用于给对象的实例变量赋值和取值
19.@property+@synthesize 与 @property增强 //问一个,最好两个都答,显得准备充分
1.@property+@synthesize搭配使用,@property生成实例变量的setter和getter方法声明,而@synthesize在.m中生成方法实现.@synthesize在生成实例变量时会检查原有实例变量中是否有与方法名同名的实例,如果有则使用该实例变量,若无,则自己在.m文件中生成与方法名同名的实例变量.这种用法只在Xcode4.4之前
2.@property增强:Xcode4.4之后,单独在.h文件中用@property会自动生成对应的setter和getter方法的声明和实现.首先会检查原声明实例变量中是否有带'_'前缀与方法名同名的实例,如果有则使用该实例,如果没有,则在.m文件中生成一个方法名带'_'前缀的实例变量
3.不论@property是否搭配@synthesize使用,生成的实例变量都在.m文件中,属于私有变量,子类和类外部无法访问,只能通过点语法(实质是setter和getter方法)来访问
4.可以重写@property生成的setter或getter方法,但是不要都重写 //可以不答这一条
20.动态类型与静态类型
动态类型:编译时类型不确定,运行时才检测的类型,例如: id obj = [Person new];
静态类型:编译时已经确定的类型,例如: Person *per = [Person new];
21.重写构造方法init
目的:让对象在创建时,实例变量就具有某些值
要求:在重写方法中调用NSObject的init方法 self = [super init]
缺点:每次创建对象,属性的值都相同
22.自定义构造方法
不属于对NSObject的init方法的重写,但是同样需要调用NSObject的init方法
优点:可以在创建对象时让其实例变量拥有指定值
要点:必须以"initWithxxx"开头,"W"必须大写
/*
举例:-(instancetype)initWith:(NSString *) Name andAge:(int) age
stu initWitn:@"赵日天" andAge: 10 */
|
|