------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:self和super关键字介绍
1.OC提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象。
OC中的self,就相当于C++和java中的this指针
2.设置器和访问器,提供外界操作内部类属性的一个通道
3.super调用父类的方法,可以重写一个已有的方法来修改或将它添加到现有的方法中,仍然可以将原来的方法纳入到修改后的方法中。
4.self应用场景
1)用在类方法中
2)用在对象方法中
3)访问成员变量
4)self在OC的内存管理特殊使用。(就业班的课)
5.self用在对象方法中
self在对象方法中使用其指向的是调用当前实例方法 的对象。
6.self用在类方法中
self用在类方法中使用其指向的是调用当前类方法的 当前类。
7.有一个Person类
Person *p = [Person new];
NSLog(@"\n Person = %p",[p class]); //[p class] 返回的是类Person的地址,也就是类对象。
8.self修饰变量
当一个对象方法的形参名和实例变量名相同时,形参将屏蔽实例变量,该对象方法类的该变量都将变成局部变量,要想在这种情况下访问实例变量, 可通过self->实例变量名来实现。
9.self使用总结
self谁调用当前方法,self就代表谁
[self 方法名称]; //调用其他方法(类方法/对象方法)
二:类的继承和派生
面向对象四大特性:封装,继承,多态,抽象
封装: 1)保护数据安全
2)隐藏复杂底层内容
3)隔离底层变化
继承:
注意事项:
1)子类不能定义和父类同名的变量
2)OC支持单一继承,不支持多继承
3)OC支持多层继承
继承体系中方法调用的顺序
1)在自己类中找
2)如果没有,去父类中找
3)如果父类中没有,就去父类的父类中
4)可以一直往上找,一直到基类(NSObject)
三:实例变量修饰符的介绍
1.实例变量的作用域
访问修饰符:public (任意程序集)
protected(同一类和派生类)
private(同一个类)
(1)@public(公开的)在有对象的前提下,任何地方都可以直接访问。
(2)@protected(受保护的)只能在当前类和子类的对象中访问。
(3)@private(私有的)只能在当前类的对象中才能直接访问。
(4)@package(框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问。
四:实例变量修饰符对子类的影响
1.@public和@protected可以被子类继承和访问
面试题:
@private 类型的变量,能否被子类继承
答:子类可以继承父类所有的实例变量和方法
@private 类型的变量,能否被子类访问
答:不能访问
2.实例变量作用域使用注意事项
1)在@interface @end之间声明的成员变量如果不做特别声明,那么默认是protected的
2)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。
五:OC中的私有变量
1.OC中的私有变量
1)在.m文件中定义的实例变量,是纯私有的变量,该变量只能在当前类中使用,不能被子类继承和访问。
2.OC中的私有方法
在.h文件中没有被声明,在.m文件中实现,此时该方法称为私有方法,不能被子类继承和访问。
*只能通过self在本类中访问私有方法
六:description方法介绍及重写
1.description方法概述
假如有一个类Person ,生成一个对象d
则:NSLog(@"\n d = %p",d); //打印的是对象的地址
NSLog(@"\n d= %@",d); //打印的是 类名: 对象的地址
当我们以%@打印对象时,实际上是调用了对象的description方法。
2.description重写的方法
-(NSString *)description{
return @"重写了description方法!";
}
或者:
-(NSString *)description{
NSString *str = [NSString stringWithFOrmat:@"年龄:%d,颜色:%d",_age,_color];
return str;
}
3.description陷阱
*重写description类方法时不能访问实例变量。
可以以%@形式打印类信息
NSLog(@"\n %@",[d class]);
千万不要在description方法中同时使用%@和self,会造成死循环
return [NSString stringWithFormat:@"%@",self];
七:多态的概念和条件
1.概念:不同对象对自己的方式响应相同名称方法的能力称为多态。
2.重点:多态的条件:
有继承关系,有方法重写
父类声明变量指向子类对象。
3.多态的优点:
1.OC提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象。
OC中的self,就相当于C++和java中的this指针
2.设置器和访问器,提供外界操作内部类属性的一个通道
3.super调用父类的方法,可以重写一个已有的方法来修改或将它添加到现有的方法中,仍然可以将原来的方法纳入到修改后的方法中。
4.self应用场景
1)用在类方法中
2)用在对象方法中
3)访问成员变量
4)self在OC的内存管理特殊使用。(就业班的课)
5.self用在对象方法中
self在对象方法中使用其指向的是调用当前实例方法 的对象。
6.self用在类方法中
self用在类方法中使用其指向的是调用当前类方法的 当前类。
7.有一个Person类
Person *p = [Person new];
NSLog(@"\n Person = %p",[p class]); //[p class] 返回的是类Person的地址,也就是类对象。
8.self修饰变量
当一个对象方法的形参名和实例变量名相同时,形参将屏蔽实例变量,该对象方法类的该变量都将变成局部变量,要想在这种情况下访问实例变量, 可通过self->实例变量名来实现。
9.self使用总结
self谁调用当前方法,self就代表谁
[self 方法名称]; //调用其他方法(类方法/对象方法)
二:类的继承和派生
面向对象四大特性:封装,继承,多态,抽象
封装: 1)保护数据安全
2)隐藏复杂底层内容
3)隔离底层变化
继承:
注意事项:
1)子类不能定义和父类同名的变量
2)OC支持单一继承,不支持多继承
3)OC支持多层继承
继承体系中方法调用的顺序
1)在自己类中找
2)如果没有,去父类中找
3)如果父类中没有,就去父类的父类中
4)可以一直往上找,一直到基类(NSObject)
三:实例变量修饰符的介绍
1.实例变量的作用域
访问修饰符:public (任意程序集)
protected(同一类和派生类)
private(同一个类)
(1)@public(公开的)在有对象的前提下,任何地方都可以直接访问。
(2)@protected(受保护的)只能在当前类和子类的对象中访问。
(3)@private(私有的)只能在当前类的对象中才能直接访问。
(4)@package(框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问。
四:实例变量修饰符对子类的影响
1.@public和@protected可以被子类继承和访问
面试题:
@private 类型的变量,能否被子类继承
答:子类可以继承父类所有的实例变量和方法
@private 类型的变量,能否被子类访问
答:不能访问
2.实例变量作用域使用注意事项
1)在@interface @end之间声明的成员变量如果不做特别声明,那么默认是protected的
2)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。
五:OC中的私有变量
1.OC中的私有变量
1)在.m文件中定义的实例变量,是纯私有的变量,该变量只能在当前类中使用,不能被子类继承和访问。
2.OC中的私有方法
在.h文件中没有被声明,在.m文件中实现,此时该方法称为私有方法,不能被子类继承和访问。
*只能通过self在本类中访问私有方法
六:description方法介绍及重写
1.description方法概述
假如有一个类Person ,生成一个对象d
则:NSLog(@"\n d = %p",d); //打印的是对象的地址
NSLog(@"\n d= %@",d); //打印的是 类名: 对象的地址
当我们以%@打印对象时,实际上是调用了对象的description方法。
2.description重写的方法
-(NSString *)description{
return @"重写了description方法!";
}
或者:
-(NSString *)description{
NSString *str = [NSString stringWithFOrmat:@"年龄:%d,颜色:%d",_age,_color];
return str;
}
3.description陷阱
*重写description类方法时不能访问实例变量。
可以以%@形式打印类信息
NSLog(@"\n %@",[d class]);
千万不要在description方法中同时使用%@和self,会造成死循环
return [NSString stringWithFormat:@"%@",self];
七:多态的概念和条件
1.概念:不同对象对自己的方式响应相同名称方法的能力称为多态。
2.重点:多态的条件:
有继承关系,有方法重写
父类声明变量指向子类对象。
3.多态的优点:
4.多态的注意事项
1)Animal *an6 = [Dog new]; // Dog类里有eat方法,Animal类没有eat方法
// [an6 eat]; //报错
[(Dog *)an6 eat]; //正确
2)Animal *an6 = [Animal new]; // Dog类里有eat方法,Animal类没有eat方法
// [an6 eat]; //报错
[(Dog *)an6 eat]; //编译可以通过,骗过编译器,但执行会错误。
5.多态的实现
假如有:父类Animal ,子类:Cat和 Dog,三个类都有run方法
Animal *a2 = [Dog new];
[a2 run]; //实质上调用的是狗的run方法
6.多态的原理
动态绑定:
八:类的本质
1.类类型的变量(实例对象)
Person *p = [Person new]; //实例化对象做了三件事情:1)申请空间 2)初始化成员变量 3)返回空间首地址
//对象isa指向类对象(代码区地址)
p就是类类型的指针变量,指向实例对象
Person也一个对象(类对象),是Class类型的对象
2.类的本质其实也是一个对象(类对象)
定义:
3.类对象如何获取
1)通过实例对象获取
Dog *dog = [Dog new];
Dog *d2 = [Dog new];
//第一种方法获取类对象
Class c = [dog class];
Class c2 = [d2 class];
2)通过类名获取(类名其实就是类对象)
Class c3 = [Dog class];
九:类对象的使用
Person *p = [Person new];
Class c1 = [p class]; //c1---->Person
1)创建实例对象
Person *p1 = [c1 new];
2)调用类方法
[c1 test];
十:理解SEL类型
1.SEL:全称selector表示方法的存储位置。
2.Person *p = [Person new];
[p test];
寻找方法test的过程:
1)首先把test这个方法名包装成sel类型的数据;
2)根据SEL数据找到对应的方法的地址;
3)根据方法的地址调用相应的方法。
4)注意:在这个操作过程中有缓存,第一次的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
关于_cmd:每个方法的内部都有一个_cmd,代表当前方法。
SEL s1 = @selector(test); //手动把test方法包装成SEL类型
[p performSelector:s1]; //响应方法,向对象p发送一个s1消息,从而调用test方法。
十一:类对象的存储细节
1.类对象的存储细节: