黑马程序员——对象的学习
2015-10-01 12:49
253 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
[b]对象[/b]
对象和结构类似。和结构一样,一个对象可以保存多个相关的数据。在结构中,我们称这些数据为成员。而在对象中,我们称这些数据为实例变量。 对象和结构的不同在于:对象还可以包含一组函数,并且这些函数可以适用对象所保存的数据。这类函数称之为方法。
类负责表述摸个特定类型的对象,其中包含方法和实现变量。
以一个命名为Person的类为例:由Person类创建的对象,成为它的实例。Person实例将使用实例变量来保存身高和体重,Person实例还将包含计算BMI的方法。如下所示:
类就像是工厂
他生产的实例
[b]创建并使用对象[/b]
以NSDate类为例,NSDate的实例代表某个时间点,可以把它当做一个时间戳。在main.m中,增加以下代码:
从代码中可以看出,OC与C语言的一点不同,包含头文件的指令采用的是#import,这和C语言中的#include有什么区别呢?#import指令导入更快更有效。#include指令告诉编译器做呆板的复制粘贴,将包含的内容粘贴到目标文件中,而#import指令则会让编辑器先检查之前是否已经导入过这个文件,或是已经被包含到目标文件中了。
[b]方法和消息[/b]
NSDate类中有一个date方法。在以上代码中,我们向NSDate类发送了date消息,让它执行date方法。
这就是一条发送消息的语句,在[NSDate date]中:
NSDate称为接收方:指针,指向接收消息的对象的地址。
date称之为选择器:方法名,要触发的反法的方法名。
在date方法执行后,NSDate实例声明一部分内存,将NSDate实例初始化为当前的日期/时间,然后返回新对象的地址。指针now中则保存了NSDates实例在内存中的地址。我们可以调用NSlog()函数,将其内容打印出来。
现在有了NSDate实例,可一给这个新对象放送消息,比如发送timeIntervalSince1970给它。
此方法会算出“自己”和1970年1月1日12:00 AM(GTM)之间的时差(以秒为单位),然后把结果返回给你。(为什么选择1970年呢?因为OS X和IOS 系统都是基于Unix开发的,而1970年正是“Unix 时代”的开始。)
发送timeIntervalSince1970给now变量指向的NSDate实例,此方法会返回一个双精度数,所以我们把这个结果保存在一个双精度变量中,代码如下:
[b]类方法和实例方法[/b]
上述代码中增添了两条消息,分别是:
第一条给NSDate类发送date消息,date是一个类方法。通常来说,类方法会创建类的实例,并初始化实例变量。
第二条是给now变量指向的NSDate实例发送了timeIntervalSince1970消息,timeIntervalSince1970是一个实例方法。通常来说,实例方法会提供实例中实例变量的信息,或是对实例的实例变量进行操作。
[b]发送消息的注意项[/b]
不能发送错误消息;
将类方法发送给实例或者将实例方法发送给类,都会引起编译器报错,当然输入错的方法名称也是不能通过编译。
注意大小写;
Objective-C是区分大小写的,因此,timeIntervalSince1970和timeintervalsince1970是两个不同的消息。
[b]Objective-C语言的命名习惯[/b]
指向实例的变量使用“骆驼拼写法”来命名。以小写字母开头,接下来每个单词的首字母用大写,如now、weigtLifer、myCurrentLocation。
方法的命名也使用“骆驼拼写法”,如date、bodyMassIndex。
类的名称以大写字母开头,但接下来的单词继续使用“骆驼拼写法”,如NSDate、Person、NSMutableArray。
很多苹果创建的类型和常量的命名也是前缀大写的“骆驼拼写法”,如NSInteger并不是类,它只是一种整形类型。
[b]对象[/b]
对象和结构类似。和结构一样,一个对象可以保存多个相关的数据。在结构中,我们称这些数据为成员。而在对象中,我们称这些数据为实例变量。 对象和结构的不同在于:对象还可以包含一组函数,并且这些函数可以适用对象所保存的数据。这类函数称之为方法。
类负责表述摸个特定类型的对象,其中包含方法和实现变量。
以一个命名为Person的类为例:由Person类创建的对象,成为它的实例。Person实例将使用实例变量来保存身高和体重,Person实例还将包含计算BMI的方法。如下所示:
类就像是工厂
Person |
heightInMeters: float weightInKlios:int |
- bodyMassIndex |
Person |
heightInMeters:1.7 weightInKlios:96 |
- bodyMassIndex |
以NSDate类为例,NSDate的实例代表某个时间点,可以把它当做一个时间戳。在main.m中,增加以下代码:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[ ]) { @autoreleasepool { NSDate *now = [NSDate date]; NSLog(@"This date is %@", now); } return 0; }
从代码中可以看出,OC与C语言的一点不同,包含头文件的指令采用的是#import,这和C语言中的#include有什么区别呢?#import指令导入更快更有效。#include指令告诉编译器做呆板的复制粘贴,将包含的内容粘贴到目标文件中,而#import指令则会让编辑器先检查之前是否已经导入过这个文件,或是已经被包含到目标文件中了。
[b]方法和消息[/b]
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实例,此方法会返回一个双精度数,所以我们把这个结果保存在一个双精度变量中,代码如下:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[ ]) { @autoreleasepool { NSDate *now = [NSDate date]; NSLog(@"This date is %@", now); double seconds = [now timeIntervalSince1970]; NSLog(@"It has been %f seconds since the start of 1970.", seconds); } return 0; }
[b]类方法和实例方法[/b]
上述代码中增添了两条消息,分别是:
NSDate *now = [NSDate date] double seconds = [now timeIntervalSince1970]
第一条给NSDate类发送date消息,date是一个类方法。通常来说,类方法会创建类的实例,并初始化实例变量。
第二条是给now变量指向的NSDate实例发送了timeIntervalSince1970消息,timeIntervalSince1970是一个实例方法。通常来说,实例方法会提供实例中实例变量的信息,或是对实例的实例变量进行操作。
[b]发送消息的注意项[/b]
不能发送错误消息;
将类方法发送给实例或者将实例方法发送给类,都会引起编译器报错,当然输入错的方法名称也是不能通过编译。
注意大小写;
Objective-C是区分大小写的,因此,timeIntervalSince1970和timeintervalsince1970是两个不同的消息。
[b]Objective-C语言的命名习惯[/b]
指向实例的变量使用“骆驼拼写法”来命名。以小写字母开头,接下来每个单词的首字母用大写,如now、weigtLifer、myCurrentLocation。
方法的命名也使用“骆驼拼写法”,如date、bodyMassIndex。
类的名称以大写字母开头,但接下来的单词继续使用“骆驼拼写法”,如NSDate、Person、NSMutableArray。
很多苹果创建的类型和常量的命名也是前缀大写的“骆驼拼写法”,如NSInteger并不是类,它只是一种整形类型。
相关文章推荐
- web前端面试题
- 黑马程序员——String类及基本数据类型包装类
- 黑马程序员——Java语言多线程
- HashMap与HashTable面试宝典
- 面试经验分享
- 面试经典题
- 火柴移动面试题
- IT生涯咨询师手记
- 大一新生,是怎样参加阿里实习生面试的
- 代码面试之串
- How to Break in as a Game Programmer(如何成为一名游戏程序员)
- 常见面试题之ListView的复用及如何优化
- LeetCode260——Single Number III精彩解法
- 【转】如何提升你的能力?给年轻程序员的几条建议
- 菜鸟好文推荐(十八)——月薪3万的程序员都避开了哪些坑?
- 模拟面试
- 20条职业发展建议,送给拒绝原地踏步的你
- 程序员不得不说的开源库
- 黑马程序员_内部类
- Java面试问题集锦04-java程序的基本结构(2)