Objective-C的超集,Objective-C的编译器支持所有的C语言程序,所以在Objective-C中使用C语言完全行得通。
后缀 | 含义 |
---|---|
.h | 头文件,包含类,类型,函数和常数的声明 |
.m | 源代码文件,可以包含oc和C代码 |
.mm | 源代码文件,除了oc和C代码还可以包括C++代码 |
Objective-C最大特色: oc中对象之间互相调用方法,可以理解为对象之间互相传递消息。
C++里类与方法的关系严格清楚,一个方法必定属于一个类,而且在编译时就已经紧密绑定,不可能调用一个不存在类里的方法。
但在Objective-C,类与消息的关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时才会动态决定,并交由类别自行决定如何处理收到的消息。
也就是说,一个类不保证一定会回应收到的消息,如果类收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。
例如如果调用一个对象没有的方法,在oc在中不会崩溃,而是抛出异常。
C++ 中调用一个对象的方法:
obj.method(argument);
Objective-C则写成:
[obj method: argument];
字符串
NSString类型提供了字符串的类包装,通过助记符可以方便的从常量值创建NSString对象。
NSString* str = @"My String\n";
NSString* str2 = [NSString stringWithFormat:@"%d %s", 1, @"String"];
// 从一个C语言字符串创建Objective-C字符串
NSString* fromCStr = [NSString stringWithCString:"A C string"
encoding:NSASCIIStringEncoding];
类
- 类是 Objective-C 用来封装数据,以及操作数据的行为的基础结构。
- 对象就是类的运行期间实例,它包含了类声明的实例变量自己的内存拷贝,以及类成员的指针。
Objective-C 的类包含了两个部分:定义(interface)与实现(implementation)。
- 定义(interface)部分包含了类声明和实例变量的定义,以及类相关的方法。
- 实现(implementation)部分包含了类方法的实际代码。
interface声明区块
类首先要在.h文件中声明,通常以@interface开始,以@end结束。
@interface 类名 : 符类名 {
int memberVar1; // 实体变量
id memberVar2;
}
+(return_type) class_method; // 类方法,类似静态方法
-(return_type) instance_method1; // 实例方法
-(return_type) instance_method2: (int) p1;
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
- 加号(+)代表类方法,不需要实例就可以调用,与C++ 的静态函数相似。
- 减号(-)即是一般的实例方法。
方法中的 : 代表参数传递,不同于C通过括号表示参数。
Objective-C方法使得参数可以夹杂于名称(这里是指参数提示名称,首个参数名省略)中间,不必全部附缀于方法名称的尾端,可以提高程序可读性。
以设定颜色RGB值的方法为例:
- (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法*/
[myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 调用方法*/
这个方法名是setColorToRed:Green:Blue:。每个冒号后面都带着一个float类别的参数,分别代表红,绿,蓝三色。
implementation实现区块
包含了公开方法的实现,以及定义私有(private)变量及方法。 以关键字@implementation作为区块起头,@end结尾。
@implementation MyObject {
int memberVar3; //私有实体变量
}
+(return_type) class_method {
.... //method implementation
}
-(return_type) instance_method1 {
....
}
-(return_type) instance_method2: (int) p1 {
....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
....
}
@end
不只Interface区块可定义实体变量,Implementation区块也可以定义实体变量,两者的差别在于访问权限的不同,Interface区块内的实体变量默认权限为protected,宣告于implementation区块的实体变量则默认为private,故在Implementation区块定义私有成员更匹配面向对象之封装原则,因为如此类别之私有信息就不需曝露于公开interface(.h文件)中。
创建对象
Objective-C创建对象需通过alloc以及init两个消息。
alloc的作用是分配内存,init则是初始化对象。 init与alloc都是定义在NSObject里的方法,父对象收到这两个信息并做出正确回应后,新对象才创建完毕。以下为范例:
MyObject * my = [[MyObject alloc] init];
在Objective-C 2.0里,若创建对象不需要参数,则可直接使用new:
MyObject * my = [MyObject new];
仅仅是语法上的精简,效果完全相同。若要自己定义初始化的过程,可以重写init方法,来添加额外的工作。(用法类似构造函数)
方法
Objective-C 中的类可以声明两种类型的方法:实例方法和类方法。
实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。
而类方法,比较起来,也就是说,不需要你创建一个实例。
方法声明包括方法类型标识符(实例方法或类方法),返回值类型,一个或多个方法标识关键字,参数类型和名称。
下图展示 insertObject:atIndex: 实例方法的声明。
声明由一个减号(-)开始,这表明这是一个实例方法。
方法实际的名字(insertObject:atIndex:)是所有方法标识关键的级联,包含了冒号。
冒号表明了参数的出现。如果方法没有参数,你可以省略第一个(也是唯一的)方法标识关键字后面的冒号。本例中,这个方法有两个参数。
-(void)insertObject:(id)anObject atIndex:(NSUInteger)index
当调用一个方法,你传递消息到对应的对象的实例方法,传递给方法的参数信息。发送给对象的所有消息都会动态分发,这样有利于实现Objective-C类的多态行为。
也就是说,如果子类定义了跟父类的具有相同标识符的方法,那么子类首先收到消息,然后可以有选择的把消息转发(也可以不转发)给他的父类。
消息在[]内,中括号中间,接收消息的对象在左边,消息(包括参数)在右边。
[myArray insertObject:anObj atIndex:0];
Objective-C允许使用嵌套消息:
[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];
类方法的典型用途是用做创建新的类实例的工厂方法,或者是访问类相关的共享信息的途径。
类方法声明的语法跟实例方法的几乎完全一样,只有一点小差别。与实例方法使用减号作为方法类型标识符不同,类方法使用加号( + )。
下面的例子演示了一个类方法如何作为类的工厂方法。
在这里,arrayWithCapacity是NSMutableArray类的类方法,为类的新实例分配内容并初始化,然后返回给你。
NSMutableArray* myArray = nil; // nil 基本上等同于 NULL
// 创建一个新的数组,并把它赋值给 myArray 变量
myArray = [NSMutableArray arrayWithCapacity:0];
重要的数据类型
NSMutableArray 可变数组
NSArray 不可变数组
NSMutableDictionary 可变数组
NSDictionary 不可变词典
网友评论