1. self关键字 self指代的是方法的调用者; 注意: 同时有对象方法和类方法存在时,self不会调错; 1>用在类方法中ð self指代调用当前方法的类 [类名 class];// 获取一个类对象(就是一个类) 2>用在对象方法中ð self指代调用当前方法的对象 3>self修饰实例变量
2. 类的继承和派生基类(父类) --> 汽车
派生类(子类) --> 卡车 小汽车1> 基类和派生类的关系2> 方法的重写ð 方法的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。 ð 重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法,不会引起冲突。从父类继承的方法,不适用于子类时,可以直接声明父类的同名方法,并定义。不用考虑父类中,方法已存在的问题。 3>继承的注意事项ð 子类不能定义和父类同名的变量,但是可以继承父类的变量 ð OC类支持单一继承,不支持多继承 ð OC类支持多层继承 4>继承体系方法的调用顺序ð 在自己类中找
ð 如果没有,去父类中找
ð 如果父类中没有,就去父类的父类中 ð 如果父类的父类也没有,就还往上找,直到找到基类(NSObject) ð 如果NSObject也没有就报错了
3. super关键字用于调用父类的方法;
4. 实例变量修饰符1> @public任意 2> @protected当前类派生类(子类) 3> @private当前类 4> @package(框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问; 实例变量作用域使用注意事项:ð 在@interface @end之间声明的成员变量如果不做特别的说明,那么其默认是 protected的。 ð 一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。
5. 实例变量修饰符对子类的影响子类可以继承父类中所有的实例变量和方法,唯独不能访问父类中@private修饰的实例变量,只能看到,不能使用; ð 能够使用父类的@public类型的变量、@protect类型的变量 ð @private 类型的变量可以看到,但是不能使用
6. OC中的私有变量(相对私有)ð 在.m中声明的实例变量 原因:导入类的头文件时,通常不会导入.m文件,因此其中的实例变量 不可见,也可以看做是私有的. 在类的实现即.m@implementation中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private的。在.m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。 ð 私有变量不可见,不能被继承,不能被访问;
7. OC中的私有方法(相对私有)OC中私有方法实现有两种方式: ð 方法在.m中实现,不在.h中声明(相对私有) ð 通过匿名类别(延展)实现私有(一般意义上的私有)
8. description方法ð descriptong方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)NSLog(@"%@", objectA);这会自动调用objectA的descriptong方法来输出ObjectA的描述信息. ð description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成员变量的值。因此,会经常重写description方法,覆盖description方法的默认实现. description重写的方法 description陷阱 千万不要在对象description方法中同时使用%@和self,下面的写法是错误的: - (NSString *)description {
return [NSStringstringWithFormat:@"%@", self]; } 同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法.
9.多态不同的对象,以自己的方式来响应同名方法的能力; 多态构成的条件1) 存在继承关系 2) 存在同名方法,并且方法进行重写 3) 父类指针必须指向子类对象 多态使用注意ð 同名方法一定可以调用; ð 父类访问子类特有的方法,需要强制类型转换; ð 注意,如果对象本身没有这个方法,强制类型转换了也要报错;
10. 类的本质类的本质: 也是一个对象(类对象),是Class类型的; Person *p = [Person new]; p 实例对象 Person 类对象 Class类型 类对象的获取:1) 使用 实例对象 来获取 类对象获取 [实例对象名 class]; 2) 使用 类名 来获取 类对象获取 [类名 class];
|