- 对象
对象和结构类似。和结构一样,一个对象可以保存多个相关的数据。在结构中,我们称这些数据为成员。而在对象中,我们称这些数据为实例变量。 对象和结构的不同在于:对象还可以包含一组函数,并且这些函数可以适用对象所保存的数据。这类函数称之为方法。
类负责表述摸个特定类型的对象,其中包含方法和实现变量。
以一个命名为Person的类为例:由Person类创建的对象,成为它的实例。Person实例将使用实例变量来保存身高和体重,Person实例还将包含计算BMI的方法。如下所示:
类就像是工厂
Person |
heightInMeters: float weightInKlios:int |
- bodyMassIndex |
他生产的实例
Person |
heightInMeters:1.7 weightInKlios:96 |
- bodyMassIndex |
- 创建并使用对象
以NSDate类为例,NSDate的实例代表某个时间点,可以把它当做一个时间戳。在main.m中,增加以下代码:
1 #import <Foundation/Foundation.h> 2 int main (int argc, const char * argv[ ]) 3 { 4 @autoreleasepool { 5 NSDate *now = [NSDate date]; 6 NSLog(@"This date is %@", now); 7 } 8 return 0; 9 }
从代码中可以看出,OC与C语言的一点不同,包含头文件的指令采用的是#import,这和C语言中的#include有什么区别呢?#import指令导入更快更有效。#include指令告诉编译器做呆板的复制粘贴,将包含的内容粘贴到目标文件中,而#import指令则会让编辑器先检查之前是否已经导入过这个文件,或是已经被包含到目标文件中了。
- 方法和消息
NSDate类中有一个date方法。在以上代码中,我们向NSDate类发送了date消息,让它执行date方法。
NSDate *now = [NSDate date];
这就是一条发送消息的语句,在[NSDate date]中:
NSDate称为接收方:指针,指向接收消息的对象的地址。
date称之为选择器:方法名,要触发的反法的方法名。
在date方法执行后,NSDate实例声明一部分内存,将NSDate实例初始化为当前的日期/时间,然后返回新对象的地址。指针now中则保存了NSDates实例在内存中的地址。我们可以调用NSlog()函数,将其内容打印出来。
NSLog(@"This date is %@", now);
现在有了NSDate实例,可一给这个新对象放送消息,比如发送timeIntervalSince1970给它。
此方法会算出“自己”和1970年1月1日12:00 AM(GTM)之间的时差(以秒为单位),然后把结果返回给你。(为什么选择1970年呢?因为OS X和IOS 系统都是基于Unix开发的,而1970年正是“Unix 时代”的开始。)
发送timeIntervalSince1970给now变量指向的NSDate实例,此方法会返回一个双精度数,所以我们把这个结果保存在一个双精度变量中,代码如下:
1 #import <Foundation/Foundation.h> 2 int main (int argc, const char * argv[ ]) 3 { 4 @autoreleasepool { 5 NSDate *now = [NSDate date]; 6 NSLog(@"This date is %@", now); 7 8 double seconds = [now timeIntervalSince1970]; 9 NSLog(@"It has been %f seconds since the start of 1970.", seconds); 10 } 11 return 0; 12 }
- 类方法和实例方法
上述代码中增添了两条消息,分别是:
NSDate *now = [NSDate date] double seconds = [now timeIntervalSince1970]
第一条给NSDate类发送date消息,date是一个类方法。通常来说,类方法会创建类的实例,并初始化实例变量。
第二条是给now变量指向的NSDate实例发送了timeIntervalSince1970消息,timeIntervalSince1970是一个实例方法。通常来说,实例方法会提供实例中实例变量的信息,或是对实例的实例变量进行操作。
- 发送消息的注意项
- 不能发送错误消息; 将类方法发送给实例或者将实例方法发送给类,都会引起编译器报错,当然输入错的方法名称也是不能通过编译。
- 注意大小写; Objective-C是区分大小写的,因此,timeIntervalSince1970和timeintervalsince1970是两个不同的消息。
- Objective-C语言的命名习惯
- 指向实例的变量使用“骆驼拼写法”来命名。以小写字母开头,接下来每个单词的首字母用大写,如now、weigtLifer、myCurrentLocation。
- 方法的命名也使用“骆驼拼写法”,如date、bodyMassIndex。
- 类的名称以大写字母开头,但接下来的单词继续使用“骆驼拼写法”,如NSDate、Person、NSMutableArray。
- 很多苹果创建的类型和常量的命名也是前缀大写的“骆驼拼写法”,如NSInteger并不是类,它只是一种整形类型。