OC学习日记Day4:创建对象,消息发送,类方法和实例方法

来源:互联网 发布:淘宝店铺怎么发布产品 编辑:程序博客网 时间:2024/05/16 23:54

OC学习日记Day4:创建对象,消息发送,类方法和实例方法

总要说明:

a. 创建和使用对象
b. 消息发送
c. 类方法与实例方法

1. 创建和使用对象

打开Xcode,选择创建一个新工程,选择OS X—>Application—>Command Line Tool。在文件main.m中修改代码如下:

//这个Foundation.h包含了很多我们要用的基础类,我们下面要调用的NSDate也包含在其中。每次创建Command Line Tool工程,Xcode都会自动帮我们补上的。#import <Foundation/Foundation.h>//main函数,工程的执行起点。当我们要启动运行这个工程时,系统就把这个main函数的起点地址传给CPU.int main(int argc, const char * argv[]) {    //@autoreleasepool 自动释放池,一个神奇的家伙,后面会了解到它。    @autoreleasepool {        //创建并初始化一个NSDate对象        NSDate *nowTime = [NSDate date];        //显示这个对象的地址        NSLog(@"This NSDate object lives at %p", nowTime);        //显示这个对象的描述        NSLog(@"The time is %@",nowTime);    }    return 0;}

程序执行结果如下:
2016-04-15 12:31:16.522 Test4[1185:66665] This NSDate object lives at 0x1005014e0
2016-04-15 12:31:16.529 Test4[1185:66665] The time is 2016-04-15 04:31:16 +0000
Program ended with exit code: 0

这个函数比较简单,声明了一个NSDate类型的指针,命名为nowTime。并使用类方法:date 将当前时间封装成一个NSDate对象。最后将这个nowTime指针指向这个对象。而NSLog()的作用是将我们想要显示的信息(NSDate的地址和描述内容)显示出来(NSLog()后面还会提到)。这样我们就完成了一个NSDate对象的创建和使用的任务了。对于nowTime指针和它所指向的对象在内存中的表示如下图:

内存示意图

2. 消息发送

在Objective-C中,如果要执行某个方法,需要发送一条消息给能执行这个方法的对象或类。对比C,C++要执行一个函数方法:(void)eating;

C:eating();
C++:Person.eating();(Person是一个包含了eating方法的对象或类)
在Objective-C中,则是这样执行:
OC:[Person eating];

分析如图所示:
发送消息示意图

由此,我们现在来分析刚刚发送的消息[NSDate date]:(因为NSDate是苹果官方提供的类,我们可以在苹果官方提供的API文档中查看关于NSDate的资料信息。在Xcode 界面中,同时按下“shift”“ command”“0”这三个键可以打开苹果API文档。在搜索栏输入NSDate即可查询NSDate的资源信息)

消息的接收者:NSDate(From API:NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).)(在这里我解释一下英文意思,但后面引用到API文档时不再解释。学会看英文API,是程序员必不可少的技能之一)(NSDate对象表示一个独立于任何日历历法和时区的时间点,在初始化之后不可改变。它实际上是相对于UTC时间(2001.1.1)的一个不可改变的时间间隔)

消息的内容:date(From API:Creates and returns a new date set to the current date and time.)(创建并返回一个新的时间对象,这个时间对象设置为当前的日期和时间)

3. 类方法和实例方法

在使用发送消息来调用一个方法时,消息的接收者可以是一个类,也可以是一个对象。前面提到过类和对象是为了帮助电脑理解现实世界而抽象的概念。类负责描述一种事物的属性和行为。而对象便是这种事物的具体个体。由于类和对象本身存在的职责不同,所以它们所执行的方法意义也是不一样的。

类方法一般是指消息的接收者是一个类,比如NSDate。通常通过执行类方法来创建类的对象,并初始化对象。

实例方法一般是指消息的接收者是一个具体的对象,比如nowTime。通常通过实例方法来提供对象中实例变量的信息,或者是对其进行一系列操作。

为了更好理解类方法和实例方法,我们可以想象一下在神话故事中的一些情节套路。在天地之初,宇宙还是一片混沌的时候,这时只有一位神存在在这片时空当中(这个神就是我们的操作系统啦)。为了让世界充满生机,这位神开始开天辟地(管理分配内存),并创造了人类,树木和所有生物(在还没有人类对象个体的时候,创造人类对象个体只能通过神的意志去创造也是就是用系统提供的类方法去创造对象)。但世界充满各种各样的生物个体(对象)的时候,生物个体(对象)便可以以自己特有的行为方式(实例方法)去生存和繁衍。对于神的意志(类方法)来说,它不具备生物个体具体的信息(对象的实例变量),它一般只具备创造这种生物的模板。对于生物个体来说,它不具备神一样的超能力(类方法),但它有自己独特的生活方式。于此,也映证了中国的一句谚语:命是上天给的,运是自己拼搏的。

在此,我们将上面的代码修改如下:

   //显示这个对象的描述   //注释掉这里NSLog(@"The time is %@",nowTime);   //在上面的格式符“%@”显示描述nowTime对象的信息实际上是调用了实例方法description,这里我们将其替换掉nowTime   NSLog(@"The time is %@",[nowTime description]);   //试着用类方法调用description显示时间消息   NSLog(@"The time is %@ from NSDate",[NSDate description]);   //试着用实例方法调用date创建对象   //NSDate *test = [nowTime date];(由于报错就加注释了,错误提示为找不到date选择器)

程序执行结果如下:
2016-04-15 17:08:40.115 Test4[1593:160272] The time is 2016-04-15 09:08:40 +0000
2016-04-15 17:08:40.115 Test4[1593:160272] The time is NSDate from NSDate

从运行结果可以看出,当对象想要执行类方法时,编译器就会发出抱怨。而当类执行实例方法时,不一定出错。这里[NSDate description]只是打印了一个NSDate的字符串,因为类本身没有具体对象那个的属性值。

0 0
原创粉丝点击