类其实就是一种数据类型,它的变量就是对象。
类可以看成是静态属性(实例变量)和动态属性(方法)的结合体。
在声明实例变量的时候不能为其初始化,系统默认会初始化。
实例变量的默认作用域范围是整个类。
“-”号开始的是实例方法,“+”号开始的是类方法。
OC中方法的调用有两种:
1):[类名或对象名 方法名]
2):对象名.方法名;
OC语言中除基本数据类型之外的变量类型都称为指针类型。
OC中的对象是通过指针对其进行操作的。
OC中对象的创建,使用alloc来创建一个对象。编译器会给object对象分配一块可用的内存地址。然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用。
self是类的隐藏的参数,指向当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的selector。
super并不是隐藏的参数,它只是一个“编译器指示符”,它和self指向的是相同的消息接收者。
当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找,然后调用父类的这个方法。
@class和import的区别
1):为什么会有这两个指令?
答:为了解决循环引用导致的死锁问题。如果有循环依赖关系,如:A->B,B->A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
2):它们的区别是什么?
答:在头文件中,一般只需要知道被引用的类的名称就可以了。不需要知道其内部的实例变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。而在实现类里面,因为会用到这个引用类的内部的实例变量和方法,所以需要使用#import来包含这个被引用类的头文件。
在OC中get这个词有着特殊的含义,因此,不要用get方法命名。
简化设置器和访问器。注意两个关键字“@property”,“@synthesize”。
在@property()括号中,可以填写的属性:
1):readwrite:默认
2):readonly:只读,意味着没有set方法
3):assign:默认,引用计数不增加
4):retain:引用计数增加1
5):原子性:atomic默认。
6):非原子性:nonatomic。
atomic是OC中的一种线程保护技术,是防止在未完成的时候,被另外一个线程使用,造成数据错误。
oc中只支持单继承。
默认的权限控制符号为:protected。
在main函数中使用“->”来访问类的公共实例变量。可以直接通过指针运算符访问实例变量,但是这违背了面向对象的思想。
动态类型:OC在运行时才能确定对象的实际类型。
动态绑定:程序在执行时才确定对象调用的实际方法。
多态:一种事物的多种状态。不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式。
多态的条件:有继承关系,有方法重写,父类的声明变量指向子类对象。
Car *bmw = [[Bmw alloc]initWithName:@“宝马” carSpeed:140 carId:1001];
[bwm run];
Car*audi = [[Audi alloc]initWithName:@“奥迪” carSpeed:120 carId:1002];
[audi run];
Car*benz = [[Benz alloc]initWithName:@“奔驰” carSpeed:100 carId:1003];
[benz run];
- (BOOL)isKindofClass:(Class)aClass; //对象是不是aClass或其子类。
- (BOOL)isMemberOfClass:(Class)aClass; //对象是不是aClass的成员。
- (BOOL)isSubclassOfClass:(Class)aClass; //对象是不是aClass的子类。
- (BOOL)respondToSelector:(SEL)aSelector; //对象是否能响应aSelector指定的方法。
- (id)performSelector:(SEL)aSelector; //对象调用aSelector指定的方法。
使用@try处理异常。
@try…
@catch…
@finally…