类的设计: 1、类名 1>类名的第一个字母必须大写 2>不能有下划线 3>多个英文单词,用驼峰标识
1>属性跟功能的声明都写在 @interface 和 @end 之间,且属性声明写在 { } 里面,功能声明,也就是方法声明,写在 { } 外面。类的实现写在 @implementation 和 @end 之间。例如:
#import<Foundation/Foundation.h>
//类的声明 @interface Person : NSObject { @public int age; double weight; } - (void)walk; @end // 类的实现 @implementation Person - (void)walk { NSLog(@"走了一段路"); } @end
int main() { Person *p = [Person new]; p->age = 20; p->weight = 50; [p walk]; return 0; }
// 利用Person这个类创建了2个Person类型的对象 // 类本身也是一个对象,是个class类型的对象,简称类对象 Person *p = [[Person alloc]init]; Person *p2 = [[Person alloc]init]; Person *p3 = [[Person alloc]init];
// 获取内存中得类对象 Class c = [p class]; Class c2 = [p2 class]; Class c3 = [Person class];
NSLog(@"c=%p,c2=%p,c3=%p",c,c2,c3); 发现内存地址都一样
#import "Person.h" @implementation Person
// 当程序启动的时候,就会加载项目中所有的类和分类,而且加载完毕后就会调用每个类和分类的+load方法,只会调用一次 +(void)load { NSLog(@"Person---load"); }
// 当第一次使用某个类的时候,就会调用当前类的+initialize方法,可以理解为类的初始化。优先级是分类—>类—>父类。 +(void)initialize { // 可以监听这个类在什么时候使用 NSLog(@"Person---initialize"); } // 不论是load还是initialize,都是先加载父类再加载子类,分类最后加载,先初始化父类,再初始化子类。 // 而且初始化时,分类优先级大于父类,只初始化分类。 // @end
分别为:编译,链接,执行 cc -c 第一个程序.m cc 第一个程序.o -framework Foundation ./a.out
编译:.m文件生成.o文件,此过程可以理解为将高级语言翻译为计算机可以理解的二进制代码,就是0跟1。这个过程只要所有的语法正确,编译器就可以编译出中间目标文件,如果函数与变量的声明的不正确,会由警告,但还是会生成.o文件。
链接:.o文件生成.out 文件,大量的Object File合成执行文件,这个动作叫作链接,也就是把多个.o 文件合成.out执行文件。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的.o中找寻函数的实现,如果找不到,那到就会报链接错误。
继承的好处: 1. 抽取重复代码 2. 建立了类之间的关系 3. 子类可以拥有父类中的所有成员变量和方法
使用场合: 1. 当两个类拥有相同的属性和方法时,就可以将相同的东西抽取到一个父类中 2. 当A类完全拥有B类中得部分属性和方法时,就可以考虑让B类继承A类
注意点: 1. 基本上所有类的跟类是NSOject 2. 只要子类继承了父类,父类中所有成员变量、方法,子类都拥有,只是子类能不能访问
@private : 只能在当前类的对象方法(中直接访问,(@implementation中默认就是 @private) @protected : 可以在当前类以及子类的对象方法中直接访问(@interface中默认就是 @protected) @public : 任何地方都可以直接访问对象的成员变量 @package : 同一个“体系内”(框架)可以访问,介于 @private和 @public之间
@implementation和 @interface中不能声明同名的成员变量
重写:子类重新实现父类中的某个方法,覆盖父类以前的做法 注意: 1. 父类必须声明在子类的前面 2. 子类不能拥有和父类相同的成员变量 3. 调用某个对象的方法时,优先去当前对象中找,如果找不到,去父类中找
坏处:耦合性太强,即:两个类的关系太强了,类B继承类A,类A离不开类B,类B也离不开类A
继承:
A { int _age; int _no; } B :A { int _weight; }
组合: A { int _age; int _no; } B { A *_a; int _weight; }
什么时候用继承,什么时候用组合呢? 套用这句话: 继承: XX 是 XXX 组合:XXX 拥有 XXX
学生是个成绩,学生拥有成绩,后面的读着顺口点,就用组合。
|
|