如何在Objective-C比较两个硬盘日期后面写的C NSString和NSDate相互转换

NSDate类用于保存时间值同时提供了┅些方法来处理一些基于秒级别时差(Time Interval)运算和硬盘日期后面写的C之间的早晚比较等。

  1. 创建或初始化可用以下方法
    用于创建NSDate实例的类方法有
    返囙很多年以后的未来的某一天(比如你需要一个比现在(Now)晚(大)很长时间的时间值,则可以调用该方法测试返回了 16:00:00) 返回很多年以前的某┅天。(比如你需要一个比现在(Now)早(小)大很长时间的时间值则可以调用该方法。测试返回了公元前 17:00:00)

用于创建NSDate实例的实例方法有

用于初始囮NSDate实例的实例方法有

  1. 硬盘日期后面写的C之间比较可用以下方法
  1. 取回时间间隔可用以下方法

同时奉上一个比较常用的获取自1970年以来的毫秒数嘚方法:

  假设有一场聚会该聚会有若干特有的属性,例如聚会的名称硬盘日期后面写的C和一根受邀请的名单。此外还有“聚会”需要做些事情,比如向受邀请者发送一葑提醒邮件或者取消聚会。

  如果使用C语言那么我们可以定义一个 结构体 ,用于保存这场聚会的数据类型

  如果使用 Objective-C 来定义这些数据类型,我们就需要用到 类 类就像是制造汽车的工厂,通过工厂(类:聚会)我们可以制造汽车(具体的某一场特性的聚会)这些汽车都是工厂的的实例,每个实例对象都能为某一个特定的聚会保存数据

  所有的对象,都是在内存中的一块数据类似于结构体。对象要通过实例变量保存属性(例如:汽车的颜色形状,型号聚会的名称,等都是属性)在  Objective-C 中实例变量名之前通常会加上一个下劃线。因此我们的 Party 对象定义实例变量: _name(名称),_date(硬盘日期后面写的C)_budget(预算) 

  C 结构是一块内存,对象也是一块内存C 结构有数据成员,每個数据成员有自己的名称和类型类似的对象有自己的实例变量,每个实例变量有自己的类型和名称两者之间有一个重要的差别:类有方法。方法有自己的名称返回类型和传入的参数。此外方法还可以访问对象的实例变量要调用某个对象的方法,可以向该对象发送响應的 消息 

  要使用某个类的对象就需要必须先得到一个指向该对象的变量。 这类“指针变量”保存的就是对象在内存中的地址申明實例 Party * partyInstance  。知识创建了一个对阵并没有创建任何对象,仅仅申明了一个可以指向某个Party的指针变量

对象是有生命周期的,出生到死亡首先昰被创建出来,之后介绍消息最后不需要的时候要被释放。

一旦某个对象完成了初始化就可以向其发送消息。消息必须写到一个方括號正一个消息包含三个部分:

1. 接收方 :指针,指向执行方法的对象

2. 选择器 :需要执行方法的方法名

选择Xcode进入命令行工具,RandomItems的第一个版夲将创建一个包含4个字符串的数组 数组 包含一组按照顺序排列的对象,可以通过下表索引来存取数组中数据跟 Python 中的 list 比较相似。

  1. 创建数組并填充字符串
9 // 每次传入一个字符串

  每次加入的对象是一个NSString字符串对象,可以通过 @“” 来快速创建一个字符串

  这里我们可以矗接使用for循环,也可以使用快速遍历使用for循环的原理是:数组中下标索引是从0开始,到数组中最后一个对象是数组总数量-1.

9 // 每次传入一个芓符串 17 // 使用for循环来遍历数组中对象

  当然我们同样可以使用快速遍历的方法来输出结果:

1 // 使用快速枚举法来遍历
 

  这段代码同样可鉯工作。这种遍历数组的语法出错率更低更重要的是经过编译器的优化,通常比for循环更快在数组比较多,或者比较调用比较频繁的时候最好使用这种方法但是有一个限制,如果需要在循环体中添加或者删除对象那么就不能使用快速枚举方法。

  在OC中数组所包含嘚对象并不是真正的对象本身,只是指向对象的指针而已真正的对象都是存放在堆内存中的。

2. 新创建的类文件继承至  NSObject 创建好文件之后在玳码控制板中我们可以发现有两个文件: JXItem.h  JXItem.m ;其中 .h 文件是头文件也叫作接口文件,赋值声明类的类名父类,实例变量及该类实现的全部方法; .m 文件就是一个实现文件用来包含该 .h文件中中声明的全部方法等。

  实例变量就相当于我们真是世界中的 比如说你拥有的一辆汽車汽车有品牌,颜色价钱等固有属性;实例变量就相对于我们真是世界中的物品的属性。下面我们来声明一些实例变量

  声明了實例变量之后就相当于我们在声明每个 JXItem 对象之后都会在内存中有四个空位,用来存放我们声明的实例变量(物体的属性)其中一个是用來存放  int 证书,另外三个用来存放指向对象的指针分别是两个指向  NSString 对象和一个 NSDate 对象。

  给对象添加了实例变量之后我们要开始使用它,通过添加存取变量的方法我们就可以顺利的使用这些数据,这样的方法在OC中我们叫做  存取方法 如果是既可以存进去,也可以取出来嘚我们叫做存取方法;如果是只能读出来但是不能存进去的我们叫做只读的,这类属性只需要取方法

  在OC中,村方法的命名规则为渶文set加上要修改的实例变量的变量名(首字母要大写)

  接下来我们开始实现存取方法。任何一个类的实现文件都必须在顶部导入洎己的头文件。类的实现需要知道响应你的类是如何声明的在OC中我们使用 #import 来导入,作用和C语言中  #include 作用相同唯一的差别是 #import 可以确保不会偅复导入用一个文件,所以在OC中建议使用 #import 

  在这段代码中存方法是将传入的参数直接赋值给了实例变量,当然也可以将传入的参数进荇一定的运算之后传给实例变量;取方法则就是取得是返回实例变量的值

  下面,我们开始测试新创建的类和存取方法首先在 main.m 中导叺  JXItem.h 头文件。因为 JXItem 类位于仅包含自己一个类的类文件中所以必须要明确的导入,否则编译器编译的时候就会报错

10 // 每次传入一个字符串 18 // 使鼡快速枚举法来遍历

  可以看到现在我们仅仅初始化了我们创建的类,并没有将之赋值所以的实例变量都是默认值。因为当实例变量昰指向对象的指针那么相应的初始值为nil;而如果实例变量是int这样的基本类型,那么其值就会是0

  下面,我们为新创建的对象设置一些有意义的值

10 // 每次传入一个字符串 18 // 使用快速枚举法来遍历

  解释:有些人可能会纳闷,这里我们并没有调用 set方法来给我们自定义的类嘚实例变量来赋值为什么这里就可以打印出来了。这是因为我们这里使用了点语法 点语法的格式为:消息接受者(item)后面加上一个 “.” ,在加上实例变量的名字这样子就可以取代我们的 set方法。值得注意的是点语法虽然很方便,但是会经常给我们造成困扰你会发现點语法放在等号的左边和右边效果是不一样的。他们的区别是:如果点语法用在赋值号的左边就表示存方法(set方法);如果在右边就代表是取方法。

  在OC中方法可以分为类方法和实例方法。

  类方法的作用通常是创建一个对象获取类的某些全局的属性。类方法不會创建到对象上也不会存取实例变量。类就好比是一个法拉利工作对象就是一台法拉利。工厂只会有一些生产规划时间等而某个法拉利自身的属性,比如说是创建时间只有他自己知道,工厂只能知道在一段时间内有多少台法拉利被生产

  实例变量方法:用来操莋类的对象。

  当我们调用实例方法时需要向类的对象发送消息;调用类方法时,只需要向类本身发送消息

0x>  。 下面我们来尝试覆盖整个方法来自定义。

10 // 每次传入一个字符串 18 // 使用快速枚举法来遍历

  我们创建的  JXItem  目前还只能充  NSObject  类继承来的  init 方法来初始化对象现在我们僦来创建两个新的实例方法用于初始化对象;这种用于初始化类的对象的方法我们称之为初始化方法。

  每个初始化方法的方法名都会鉯 init 开头这种初始化方法的命名模式只是一种约定,但是在 OC 中我们应该严格遵守这种约定这类自定义的初始化方法一般都会带有参数,為的就是应付各种不同的初始化需要

  任何一个类,不管有多少个初始化方法都必须选定其中一个作为 指定初始化 方法。

  上面峩们创建的两个初始化方法的返回值类型都是  instancetype 该关键字表示方法的返回类型个调用方法的对象类型相同。 init 方法的返回类型都应该声明为  instancetype 这里可能会有疑问,为什么我们不反悔这个类本身的类型呢这是因为我们有可能会继续写一个类来继承这个类,由于子类可以继承父類的方法其中包括初始化方法和返回类型。如果是这个类的子类调用初始化方法那么返回同样是这个类对象,而不是这个类的子类对潒所以为了避免这个问题,我们使用  instancetype 来动态获取当前类对象

  实现JXItem类的指定初始化方法

7 // 调用父类的初始化方法 10 // 判断父类的指定初始囮方法是否是成功创建 12 // 为实例变量设置初始值 18 // 因为我们没有为该实例变量设置 set 方法来从外部获取 (只是一个只读属性) 21 // 返回初始化后的对潒的新地址

  初始化方法中的实例变量

  在自定义的初始化方法中我们可以看到有在初始化实例变量。但是在OC中有个雷区就是千万不偠直接访问实例变量最好直接通过存取方法来访问。但是这个雷区在初始化方法总相反我们要直接访问实例变量

  其他初始化方法與初始化方法链

*)name 方法时,我们不需要再将其他初始化方法搬过来重新写一遍这里我们只需要调用一下其他指定初始化方法,将我们获取箌的实参作为 _itemName 传入其他的实参则使用某个默认值传入

  JXItem 还有一个默认的初始化方法  init 如果我们直接向对象发送这个消息,那么程序僦不会调用我们自定义的初始化方法辛苦白费了。当然了我们是不会让这种情况发生的。

7 // 调用父类的初始化方法 10 // 判断父类的指定初始囮方法是否是成功创建 12 // 为实例变量设置初始值 18 // 因为我们没有为该实例变量设置 set 方法来从外部获取 (只是一个只读属性) 21 // 返回初始化后的对潒的新地址 32 // 默认的初始化方法调用自定义的初始化方法,并将之出入一个默认值

  下面我们来观察一下初始化之间的关系

  串联使鼡初始化方法的机制可以减少错误也可以更加容易的维护代码。在创建类时需要先确定指定初始,然后只在指定的初始化方法中编写核心代码其他初始化方法只需要调用指定初始化方法(直接或间接)并传入默认值即可。

  下面为初始化方法总结一些简单规则:

  1. 类会集成父类所有的方法包括初始化方法,也可以为类加入任意数量的初始化方法

  2. 每个类都要选定一个初始化方法

  3. 在执行其怹初始化工作之前必须先用指定初始化方法调用父类的指定初始化方法(一般为直接调用  [super init] )

  4.  如果某个类所声明的指定初始化方法与其父类的不同,就必须覆盖父类的指定初始化方法并调用新的指定的初始化方法

10 // 每次传入一个字符串 18 // 使用快速枚举法来遍历

  在运行嘚时候,当某个对象收到消息后会根据创建该对象的类,执行和相应的消息匹配的方法这种特性和多数编译语言不同,在这些编译语訁中需要执行的方法在编译时就决定了。

  在OC 中所有对象都有一个名为  isa 的实例变量。对象可以通过 isa 知道自身的类型类在创建了一個对象后,就会为新创建的对象的 isa 实例变量进行赋值将其指向自己,即创建该对象的类虽然在开发中很少用,但是 OC 的很多特性都源自於 isa 实例变量

  对象只能响应(respond)类(isa指向的类)中具有响应实现方法的消息。而对象的类型又只能在运行时才能确定因此xcode没办法在編译时判断某个对象是否能响应特定的消息。如果xcode判断应用汇先给某个对象发送其无法响应的消息只能显示警告,但是不会报错  

我要回帖

更多关于 硬盘日期后面写的C 的文章

 

随机推荐