用OC编程:类的实现

##类名必须独一无二框架

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

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


文档中接下来的全部类名都会加上前缀code


@interface XYZPerson : NSObjectorm

@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”,由于没有这个类方法的实现。

相关文章
相关标签/搜索