1. 扩展名
. 头文件。头文件中包含类、类型、函数和常量的声明。
.m 源文件。可以包含C代码和Objiect-C代码。
.mm 源文件。除了可以包含C代码和Object-c代码外,还可以包含C++代码
2. 包含头文件
当需要包含头文件的时候,可以使用标准的#include预编译指令,也可以使用#import指令。推荐使用#import指令,因为他能保证相同的文件永远不会被多次包含。并且Objective-c的示例和文档都建议使用#import。
3. Strings
Objective-C在指定字符串的时候,具有和C一样的约定。单字符使用单引号,字符串使用双引号。但是Objective-C多使用NNString类。
NNString类是字符串的对象载体,具有处理任意长度的字符串内置的内存管理、支持Unicode、Printf风格的格式化等优点。由于一些字符串经常使用,Objective-C提供了一个速记符号从常量创建NSString对象。使用这用速记,你所要做的仅仅是在一个正常的双引号包含的字符串之前加上一个@符号。
NSString* myString = @"My String ";
NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];
// Create an Objective-C string from a C string
NSString* fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];
4. Classes类
(1) Objiective-C中创建一个类需要两部分:接口和实现。接口部分包含类的声明,还会定义成员变量和与类相关联的方法。实现部分包含类方法的实际实现代码。
(2) 类声明以@interface预编译指令开始,以@end指令结束。类名之后是父类的名称,以冒号分割。类的成员变量在大括号包含的代码中声明({})。在成员变量之后的代码块是类声明的方法列表。每个成员变量和方法之后都要以分号结尾。
@interface MyClass : NSobject
{
int count;
id data;
NSString* name;
}
- (id)initWithString:(NSString*)aName;
+ (MyClass*)createMyClassWithString:(NSString*)aName;
@end
(3) 类的实现。是由两个预编译指令来指示:@implementation和@end。方法的定义于接口中声明的要匹配。
@implementation MyClass
- (id)initWithString:(NSString*)aName
{
count = 0;
data = nil;
name = [aName copy];
return self;
}
+ (MyClass*)createMyClassWithString:(NSString*)aName
return [[MyClass alloc] initWithString: aName];
@end
(4) 当使用变量存储对象时,经常会使用指针类型。Objective-C中,强类型和若类型变量都可以保存对象。强类型指针的变量在声明时必须包含类名。集合类经常使用弱类型指针。
MyClass* myObject1; // 强类型
id myObject2; //弱类型
5 Methods
(1) Objective-C语言中的类可以声明两种方法:实例方法和类方法。实例方法必须先声明一个类的实例,然后才可以使用这个实例来调用实例方法。类方法则不需要创建类的实例。
(2) 方法的声明有方法类型标识符、返回类型、一个或多个署名关键字和参数的名称、类型信息组成。方法声明的前面加上一个符号“-”,这说明这个方法是一个实例方法。方法声明中,冒号说明参数的存在。如果方法没有参数,第一个署名关键字之后可以忽略冒号。
(3) 当调用一个方法时,要通过“messaging”来通知相应的对象。消息就是方法名和这个方法所需要的参数信息。发送到对象的所有消息是动态发送的,这有利于Objective-C的多态性。既是:如果子类定义了与父类同名的方法,子类会第一个受到消息,然后可以选择是否要奖这个消息转交给他的父类。
(4) 消息都是放在方括号中。在方括号中,收消息的对象放在左边,消息(和消息需要的参数)放在右边。为避免声明大量局部变量来存储临时数据,Objective-C支持嵌套消息。每一个嵌套消息的返回值都可以作为另一个消息的参数或者是目标。
(5) 类方法的定义语法与实例方法是完全一样的,只有一点不同。类方法使用加法符号(+),而不是减法符号作为方法的类型标识符。
6 属性
(1) 属性是一种便利符号,用来代替存取方法(accessor methods)。属性并不是在类的声明中创建一个新的成员变量。他们仅仅为定义用来访问已经存在的变量的方法指定的快捷方式。类可以使用属性标记来公开成员变量,而不是使用getter和setter方法。类还可以使用属性来公开“virtual”(虚)的成员变量―它是动态计算的一部分数据并且并不实际存储在成员变量中。
实际点说,属性的使用减少了你的冗余代码量。应为大部分存取方法用相似的方式实现,使用属性可以不必为每一个成员变量提供截然不同的getter和 setter方法。相反,你可以使用属性的声明指定具体的动作,在编译的时,会根据声明合成实际的getter和setter方法。
因为属性的声明会创建实际的方法,可以和方法的声明一起定义在类的接口中。基本的定义使用@property预编译指令,后边是属性的类型信息和名称。可以使用定制选项配置属性,它定义了存取方法有怎样的行为。下面的例子显示了一些简单的类型声明:
@property BOOL flag;
@property (copy) NSString* nameObject; // 赋值过程中拷贝对象
@property (readonly) UIView* rootView; // 仅创建getter方法 属性的另一个好处是在代码中可以使用点语法来访问他们,如下演示:
myObject.flag = YES;
CGRect viewFrame = myObject.rootView.frame;
尽管上面的例子中的对象和属性的名字很做作,但是他们演示了属性的灵活性。点语法实际上屏蔽了相关一系列方法的调用。每个可读属性由同名的方法支持。每个可写属性由附加的方法setPropertyName:支持,在这里属性名称的第一个字母大写了。(这些方法是属性的实际实现,同时也是可以在没有成员变量支持的类中包含属性定义的原因。)不用属性去实现上面代码完成的功能,你需要编写如下代码:
[myObject setFlag:YES];
CGRect viewFrame = [[myObject rootView] frame];
关于在类中如何声明属性的更多信息,请查阅Objective-C程序设计中”属性”一节。
7 协议和代理\
协议声明的方法可以被任何一个类实现。协议不是类本身。他们仅定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,你的类就是遵守这个协议的。
iPhone OS中,协议经常被用作实现代理对象。代理对象是一个能代表其它对象或与其它对象合作的一个对象。学习协议、代理和其它对象相互影响的最好方法就是从例子中学习。
UIApplication类实现了应用程序所需的功能。不是强制继承UIApplication类来接收一个简单的应用程序当前状态的通知,而是 UIApplication类调用赋值给代理对象的方法来分发这些通知。实现了UIApplicationDelegate协议方法的对象可以接收这些通知并提供合适的响应。
协议的声明类似于类接口的声明,有一点不同的是,协议没有父类,并且不能定义成员变量。下面的例子演示了只有一个方法的协议的声明:
@protocol MyProtocol
- (void)myProtocolMethod;
@end
很多代理协议中,采用协议只是大概实现了协议中定义的方法。一些协议需要明确声明支持的协议,但是现在假设仅实现方法就足够了。