OC Note
1. .h ->@property int x,y; .m->不使用 @synthesize,生成的setter和getter是_x, _y. 使用@syntherisze x,y; 生成的setter和getter都是x, y;
2. .h -> 多参数函数: -(void) setX: (int)x y:(int) y; .m -> -(void) setX: (int)x y:(int)y{...}
3. 调用new class, newClass * test = [[newClass alloc] init];
[test setX: 3 y: 5];
4. static 关键字: 在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值。
只能在定义静态变量和局部变量的方法中访问这些变量。可以将变量的声明移到所有方法声明的外部(通常放在implementation文件的开始处),这样所有的方法都能狗访问它们。
5. OC中一般用 . 来调用实例的属性,方法还是用[classInstance function].
继承
1. @class指令
例: @class XYPoint; 因为编译器在遇到实例变量XYPoint时,必须了解XYPoint是什么。另一条选择是可以导入头文件替代这条指令,语句如下:#import "XYPoint.h". 使用@class 指令提高了效率,因为编译器不需要引入和处理整个XYPoint.h 文件,只需要知道XYPoint 是一个类名。如果需要引用XYPoint 类的方法(在实现部分中),@class 指令是不够的,因为编译器需要更多的消息。它需要清楚方法有多少参数、它们是什么类型、方法的返回类型是什么。
2. 抽象类,定义方法和实例变量,但不期望从这个类创建实例(没有实现方法)。
多态、动态类型和动态绑定
多态:不同类可以定义相同的方法。
动态类型:id:可以存储任何类的对象。id dataValue;
动态绑定:先判定对象所属的类,然后在运行时确定动态调用的方法,而不是在编译的时候。
className * test = [[className alloc] init];
id dataValue = test; //动态绑定,知道dataValue的类
id dataValue = [[className alloc] init];
[dataValue setX:1 overY:2]; //这是在运行的时候才调用setX: overY: 方法,因为不知道dataValue的类。
异常
@try { } @catch (NSException *exception) { } @finally { }
@throw 抛出异常。
一般来说,你并不希望程序在运行时发生异常。这就需要考虑更好的编程实践,在错误发生之前做测试,而不是错误发生之后捕获它。测试方法的错误并返回一些值作为错误的标识,而不是抛出异常。抛出异常通常会使用大量的系统资源,Apple反对非必要的使用异常(例如,你不希望因为一个文件无法打开而抛出异常)。
常见的编程习惯是类中的所有的初始化方法都是以 init 开头。
重载 init 方法:
- (instancetype) init { self = [super init]; if (self){ //初始化代码 } return self; }
这个方法首先会调用父类的初始化方法。执行父类的初始化方法,使得继承的实例变量能够正常的初始化。必须将父类的 init 的执行结果赋给 self, 因为初始化过程改变了对象在内存中的位置(意味着引用将要改变)。
如果父类的初始化过程成功,返回的值将是非空的,通过if语句可以验证。注释说明可以在这个代码块的位置放入自定义的初始化代码。通常可以在这个位置创建并初始化实例变量。
extern引用外部变量:
类1: int gGlobalVar = 100; //定义全局变量,需定义在该类的实现文件中
类2: extern int gGlocalVar; //在另一个类中引用gGlobalVar.
如果有很多方法需要访问gGlobalVar的值,只在文件的开始进行一次extern声明比较简便。但是,如果只有一个或少数几个方法要访问这个变量,就应该在其中的每个方法中单独进行extern声明。这样程序的组织结构更加清晰,并且实际使用到的不同函数可以单独使用这个变量。
协议
@Protocol
定义: 协议是多个类共享的一个方法列表。协议中列出的方法没有相应的实现,计划有其他人来实现。协议提供了一种方式,用指定的名称定义一组多少有点相关的方法。这些方法通常有文档说明,所以你知道他们将如何执行。因此,如果需要,可在自己的类定义中实现他们。
在.h中定义,
@Protocol NSCoding -(void) copyWithZone: (NSZone *) zone; @end
使用: 如果你定义的类要使用NSCoding协议, <..协议..>,那就需要AddressBook类中实现copyWithZone方法。
@interface AddressBook:NSObject <NSCoding, NSCopying> - (void) PrintV; @end
如果不想别人看到你的类遵循哪些协议,那就写到.m文件中
@interface ProfilePreviewContoller () <NSCoding> ... @end
代理
协议也是一种两个类之间的接口定义。定义了协议的类可以看作是将协议定义的方法代理给了实现他们的类。这样,类的定义可以更为通用,因为具体的动作由代理类来承担,响应某些事件或者定义某些参数。