总结:
类class与对象instance(实例):
如果“书本”是一个类型,那么《一本书》可以是“书本”的一个对象,而《第二本书》可以是“书本”的另一个对象
Book *book1 = [[Book] alloc] init] <-- 这里就是说 book1 是 类型 Book 的一个对象
类与结构
两者不一样,类的实例是将堆里面的数据的指针储存在栈上,结构是直接将值存储在栈上。
这也就造成拷贝与传参的不同
这就使得对于拷贝(这里的拷贝指的是直接用“=”,和(copy)不一样)与传参后的类的改变也会在原本的类中出现(在rp2中的更改会对rp1有影响),但是结构不会
类型中的数据成员:
在类型中主要有属性和实例变量两种数据成员,编译器会默认为一个属性合成一个getter,setter以及一个"_属性名字"的实例变量。
类外一律通过属性访问,且不可以访问实例变量,可以通过 [实例 访问器方法] (发讯息)的方式获得,也可以直接 ”实例.属性" 来获得
除了实例里可以有属性之外,类本身也可以有static的变量
循环引用和拷贝属性(copy)&(weak)
为了避免循环引用造成无法释放内存,可以使用(weak)。为了获得一个独立的的拷贝,可以使用(copy)
类型中的函数成员:
方法主要分为实例方法与类方法,实例方法用"-"减号表示,类方方法"+"表示。类型方法不可以访问实例的成员(实例的属性,变量,方法)
self在不同情况下会有不同的作用
特殊的方法有alloc,init,dealloc等
注意:自定义的initialize类初始化器中应当包含 if(self==[类名 class]){ ... } 以避免调用多次。自定义的dealloc不需要有[super dealloc],编译器自动后置调用。
继承和多态:
子类可以通过 " 子类名称 : 父类名称 " 例如 " Shape : NSObject " 这种方式来继承父类的变量,属性,方法等。而且可以在接受父类实例的行为里面使用 (例如 void process(Shape*shape){...} 就可以接受 Shape 的子类。
在子类型中,可以重写 Override 父类的方法,以达到不同的效果。重点:在父类方法A中调用另外一个方法B,如果这个方法B在子类中重写了,那么就会变成子类的方法B,而不是父类的。
注意:因为上述的这种特性,所以应当在父类的init、dealloc方法中避免使用self
实例方法看的是实际类型,和申明类型无关。但是类方法不一样,看的是类方法的类。
super可以用来调用基类的实现