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];spa
4. static 关键字: 在变量声明前加上关键字static,可使局部变量保留屡次调用一个方法所得的值。代理
只能在定义静态变量和局部变量的方法中访问这些变量。能够将变量的声明移到全部方法声明的外部(一般放在implementation文件的开始处),这样全部的方法都能狗访问它们。code
5. OC中通常用 . 来调用实例的属性,方法仍是用[classInstance function].对象
1. @class指令blog
例: @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语句能够验证。注释说明能够在这个代码块的位置放入自定义的初始化代码。一般能够在这个位置建立并初始化实例变量。
类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
协议也是一种两个类之间的接口定义。定义了协议的类能够看做是将协议定义的方法代理给了实现他们的类。这样,类的定义能够更为通用,由于具体的动做由代理类来承担,响应某些事件或者定义某些参数。