用OC编程:类的实现

##类名必须独一无二

在一个程序中,类名必须是独一无二的,当然这包括了使用的类库和框架这些范围。如果说创建的新类和原有的类名称冲突了,就会报一个
编译错误。

因此在定义类的时候在名字前面加上两到三个字母作为前缀。这些字母的含义可能跟你在写的程序有关,或者是框架的名称的重用代码,或
者仅仅是你名字的缩写。


文档中接下来的所有类名都会加上前缀


@interface XYZPerson : NSObject

@property (readonly) NSString *firstName;

@property (readonly) NSString *lastName;

@end

 

历史记录:那么为什么那么多的类会用NS作为前缀呢?这要追溯一下Cocoa和Cocoa Touch的历史。Cocoa的诞生,是作为NeXTStep操作系统
的应用程序集合框架来制造出来的。在1996年,Apple公司收购NeXTStep的时候,很多NeXTStep的东西都被引入了OSX当众,包括现有的类名
称。Cocoa Touch的地位就相当于iOS里面的Cocoa;一些类在Cocoa和Cocoa Touch中都可以使用,还有很多的类是分别在两个平台独有的。

相对来讲,方法名和属性名就仅仅需要在所定义的类中保持唯一性就好。虽然程序中的C函数需要一个唯一的名称,但是对于多个OC类来说
,同名的方法是可以接受的。你不能再同一个类声明中多次定义一个方法。想要覆盖掉从父类继承的方法,就必须使用一摸一样的名字来声
明方法。

和方法名一样,对象中的属性和实例变量必须在类的范围内唯一。如果使用的是全局变量,就要保证在整个项目范围内名称唯一。

#类的实现就是说一说它类的内部行为

定义了类的接口之后,类的属性和方法都作为公共接口暴露了出来,你还需要写代码来实现这个类的行为。

如前所述,类的接口通常是放在一个专用的文件中,即头文件,文件的扩展名一般是.h。OC类的实现文件扩展名一般是点m。

在编译源代码文件的实现之前,首先要告诉编译器读取在头文件中定义的接口。OC编译器为此专门提供了一个预编译器指令,#import。看
上去很像是C语言的#include指令,但是#import指令可以确保在编译中这个文件仅仅会被包含一次。

请注意,预处理器的指令不同于传统的C语言指令,它不需要用分号作为结尾。

##类实现的基本语法

类实现的基本语法如下

#import "XYZPerson.h"

@implementation XYZPerson

@end

如果你在类接口中定义了任何方法,就需要在这个文件中实现方法。

###怎么实现方法

下面是一个方法在接口中的简单声明:

@interface XYZPerson : NSObject

- (void)sayHello;

@end

这个方法的实现差不多是这样子

#import "XYZPerson.h"

@implementation XYZPerson

- (void)sayHello {
NSLog(@"Hell, World!");
}

@end

样例中的代码使用了NSLog()函数,他会在控制台上列印一个消息。很像是C语言里面的printf()函数,接受一定数量的参数,第一个参
数是一个OC字符串对象。

方法的实现很类似C的函数定义,都是使用花括号来包含相关代码。另外,方法的名称必须和原型的名字是一样的,参数和返回值也必须是
一样的。

OC和C一样是大小写敏感的,所以sayhello方法和sayHello方法时完全不同的方法。

一般来说,方法名应该是以小写字母开头。相较C语言函数来说,OC中的规范是使用一些更加具有描述性意义的名字。如果方法名包括了多
个单词,就使用驼峰命名方法,增加可读性。

- (void)satHello

{
NSLog("Hello, World!");
}

Xcode,Apple的集成开发环境(IDE),用来创建OSX和iOS软件,Xcode会自动基于用户自定义的配置选项来缩进代码。

##OC类也是对象

在OC中,一个类本身也有一个隐晦的类型叫做Class。类不可以有像之前实例中出现的用声明语法声明的属性,但是却可接受消息。

一个类方法的典型应用就是作为一个工厂方法使用,这个工厂方法可以用来分配和初始化动态创建的对象。比如NSString类,这个类有很多
工厂方法来创建空字符串等等,或者说用特定字符初始化字符串的工厂方法。

+ (id)string;

+ (id)stringWithString:(NSString *)aString;

+ (id)stringWithFormat:(NSString *)format, ...;

+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncodeing)enc error:(NSError **)error;

+ (id)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc;

上面的例子中,类方法的标志就是用一个+开头,不同的是实例方法使用的是减号-开头。

类似于实例方法的原型,类方法的原型也会包含在类接口中。类方法的实现方式和实例方法一样,在@implementation代码块中实现类。

##练习

笔记:为了完成本章最后的练习,你或许需要创建一个Xcode项目。这会确保你的代码没有编译错误。

1. 使用Xcode新建文件模板窗口来创建接口和实现文件,类名叫做XYZPerson,街橙子NSObject类。

2. 在XYZPerson类接口中添加属性,姓名还有生日(日期表示为NSDate类)。

3. 声明和实现sayHello方法。

4. 增加一个类工厂方法的声明,叫做“person”。先不要实现,等到下一章再实现。

笔记:如果你编译这个代码,会得到一个警告“Incomplete implementation”,因为没有这个类方法的实现。

 

posted on 2015-08-07 16:40  zhangzj00000000  阅读(487)  评论(0编辑  收藏  举报

导航