在继承的语法里,子类对象如何调用到 正确方法的机制
在每一个OC对象都有一个隐藏的指针指向类的代码,当向一个对象发送消息的时候,当前的对象首先会在当前类里去查找相应的方法,如果找到的话,就直接执行代码,如果没有找到,则会去父类里查找对应的方法,如果找到的话,机会执行。如果找不到会继续按照这样的原则,沿着继承链向上查找,知道根类NSObject(这个类是OC所有类的根类),如果在这个类也没有找到相应的方法,则程序直接崩溃。
在继承语法里,子类对象如何访问到父 类的实例变量
创建一个新类的时候,其对象首先从自身的超类继承实例变量,然后会添加自己的实例变量。在这种情况下,每一个子类对象的指针指向对象的最顶端,也就是沿着继承链所包含的所有对象的最开始位置,这样编译就可以通过地址的偏移来计算就能访问到所有超类的实例变量。
重写的概念
重写的概念,只存在于继承的语法中,指的是:父类声明一个方法,但是父类并没有真正意义的实现这个方法,那么在子类里,真正地实现方法的功能,这种形式就叫作对这个方法的重写。重写的方法是为了实现面向对象编程里的的多态。
NSLog调用%@的机制
使用NSLog格式化参数是%@的时候,实际上是去调用打印对象的description方法,这个方法返回什么值,打印的结果就是什么值。
OC中的聚合组合和存取方法
组合和聚合表示将各个部分组合在一起,用于表达整体与部分的关系。聚合:表示一种弱的整体与部分的关系,eg:大雁和雁群。组合:表示一种强的、严格的整体与部分关系,部分与整体的生命周期一样。eg:人和人头
存取方法:用来读取或改变特定属性的方法
setter方法 用于给对象的成员变量赋值
getter方法 用于读取成员变量的值命名规范:setter方法根据要赋值的的成员变量来命名并加上前缀“set”,getter方法则根据其返回的属性名称来命名,不需要加前缀“get”可以通过代码实现建立一个QYCar类,在其QYCar.h中添加属性和声明方法
@interface QYCar : NSObject
{
QYEngine *engine;
QYTire *tires[4];
}
-(void)setEngine:(QYEngine *)Engine;
-(QYEngine *)engine;
-(void)setTires:(QYTire*)tire tireAt:(TireLocation)index;
-(QYTire *)tire:(TireLocation)index;
-(void)print;
在main函数中调用setter方法和get方法
int main(int argc, const char * argv[])
{
QYCar *car = [QYCar new];
QYEngine *engine = [QYEngine new];
[car setEngine:engine];
QYTire *rightFrontTire = [QYTire new];
[car setTires:rightFrontTire tireAt:kRightFrontTire];
QYTire *leftFrontTire = [QYTire new];
[car setTires:leftFrontTire tireAt:kLeftFrontTire];
QYTire *leftBackTire = [QYTire new];
[car setTires:leftBackTire tireAt:kLeftBackTire];
QYTire *rightBackTire = [QYTire new];
[car setTires:rightBackTire tireAt:kRightBackTire];
[car print];
return 0;
}