您的位置:首页 > 移动开发 > Objective-C

Objective-C---7---NSDate Protocol Category

2015-10-06 12:09 337 查看

1. NSDate:

用来获取时间 或者计算时间

NSTimeinterval:(即ouble类型)以秒为单位

/*
NSDate 是objC中提供日期处理的一个类:
获取当前时间
计算时间
格式化显示时间
日期对象的使用
*/
#pragma 计算时间:
{
// 获取当前时间:显示的是0时区的时间
NSDate *date = [NSDate date];
NSLog(@"%@", date);

// 获取本地时间:相当于加8小时
NSDate *now1 = [NSDate dateWithTimeIntervalSinceNow:6 * 40 * 60]; // 乘积结果单位是秒

NSLog(@"%@",now1);
NSDate *now2 = [NSDate dateWithTimeIntervalSinceNow:8 * 40 * 60];
NSLog(@"%@",now2);
NSDate *now3 = [NSDate dateWithTimeIntervalSinceNow:8 * 00 * 60];
NSLog(@"%@",now3);
NSDate *now4 = [NSDate dateWithTimeIntervalSinceNow:8 * 40 * 00];
NSLog(@"%@",now4);
NSDate *now5 = [NSDate dateWithTimeIntervalSinceNow:10 * 1* 1];
NSLog(@"%@",now5);

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:8 * 60 * 60 - 24 * 60 * 60];
NSLog(@"%@",yesterday);

NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:8 * 60 * 60 + 24 * 60 * 60];
NSLog(@"%@",tomorrow);

NSTimeInterval interval1 = [tomorrow timeIntervalSinceDate:yesterday];
NSLog(@"%.2f", interval1 / 3600);

// 微信聊天:接收信息--记录接收时间--发送信息--记录时间--计算时间差
NSLog(@"hello world");
NSDate *get = [NSDate date];
char ch[200] = {0};
scanf("%s", ch);
// 将C语言字符串  转换为OC对象
NSString *message = [NSString stringWithUTF8String:ch];
NSLog(@"%@", message);
NSDate *send = [NSDate date];

NSTimeInterval interval2 = [send timeIntervalSinceDate:get];
if (interval2 < 60) {
NSLog(@"刚刚");
}else if (interval2 > 60 && interval2 < 3600){
NSLog(@"分钟:%.2f", interval2 / 60);
}
}


打印结果显示:

打印出hello world之后,需要输入东西:

2015-10-06 10:30:38.597 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +0000
2015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 06:30:38 +0000
2015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 07:50:38 +0000
2015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +0000
2015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +0000
2015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:48 +0000
2015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-05 10:30:38 +0000
2015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-07 10:30:38 +0000
2015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 48.00
2015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] hello world

hahaha
2015-10-06 10:30:50.172 Lesson-OC-7-NSDate[789:40716] hahaha
2015-10-06 10:30:50.172 Lesson-OC-7-NSDate[789:40716] 刚刚
Program ended with exit code: 0


将C语言字符串 转换为OC对象:

NSString *message = [NSString stringWithUTF8String:ch];

2. NSDateFormatter

2.1 格式化显示时间:

日期格式:

yyyy 年

MM 月

dd 天

HH 24小时制

hh 12小时制

mm 分钟

ss 秒数


#pragma 格式化显示时间:
{
// 格式化日期:按照需求呈现出内容:
NSDate *date = [NSDate date];
NSLog(@"%@", date);

NSDateFormatter *myFor = [[NSDateFormatter alloc] init];
myFor.dateFormat = @"yyyy年MM月dd日 EEEE GGGG aaaa hh:mm:ss";
NSString * da = [myFor stringFromDate:date];
NSLog(@"%@", da);
[myFor release];
}
打印结果显示:

2015-10-06 10:29:26.704 Lesson-OC-7-NSDate[780:40180] 2015-10-06 02:29:26 +0000
2015-10-06 10:29:26.705 Lesson-OC-7-NSDate[780:40180] 2015年10月06日 星期二 公元 上午 10:29:26


NSDateFormatter这个类型就是固定你的时间显示格式而已:

stringFromDate:将时间转换为用户要求的显示格式(字符串)

dateFromString:将字符串转换为时间(下一个例题会用到)

2.2 日期时间对象的使用

#pragma 日期时间对象的使用
{
// 将日期的字符串转换为日期对象:NSString转换为NSDate
// 1. 创建包含日期信息的字符串:
NSString *p= @"2015年10月6日 9点58分50秒";
// 2. 创建格式化日期对象:
NSDateFormatter *forma = [[NSDateFormatter alloc] init];
// 3. 设置日期转换格式:
[forma setDateFormat:@"yyyy年MM月dd日 hh点mm分ss秒"];
// 4. 转换
NSDate *date= [forma dateFromString:p];
NSLog(@"%@", date);

[forma release];
}


打印结果显示:

2015-10-06 10:33:21.391 Lesson-OC-7-NSDate[797:41650] 2015-10-06 01:58:50 +0000
Program ended with exit code: 0


3. Category:

category:人称(分类/类目/类别/类扩展)

category:包含方法的声明和方法的实现(.h和.m)

分类的作用:

1. 在不修改原有类的基础下,给类增加新的功能

2. 一个大的类可以分模块开发,多人进行编写

分类的目的:

1. 对现有类进行扩展:子类也可以继承分类

2. 作为子类的替代手段:

3. 对类中的方法归类:

使用分类的步骤:

1. 声明分类: @interface 类名(分类名称) @end

2. 实现分类: @implementation 类名(分类名称) @end

3. 使用分类:


#pragma 在原有的类中添加分类
{
Person *p = [[Person alloc] init];
[p run];

#pragma 使用单独的文件创建Category
[p playDota];
[p studyC];

#pragma 使用分类的注意事项:
// 1. 在分类中不可以声明实例变量
// 2. 在分类中可以访问原类的实例变量
// 3. 在分类中存在和原类同名的方法  分类方法优先级 > 原类方法优先级
// 4. 多个分类中的同名方法:最后编译的分类方法 > 其他分类方法
[p eat]; // 先调用分类的方法

#pragma 非正式协议
// 非正式协议:就是类别Category 凡是给NSObject及其Foundation框架中的子类添加的分类,就是非正式协议

[p uninstallLOL];
[p release];

Student *student = [Student new];
[student uninstallLOL];
}


#pragma 练习题:判断字符串中数字的个数,要求所有的字符串都具有这个方法 继承于NSString

#pragma 练习题:判断字符串中数字的个数,要求所有的字符串都具有这个方法  继承于NSString

// 定义字符串--循环遍历--提取字符串中的每个字符--判断是否是数字--修改计数值--输出结果

 NSString *str = @"dfghj48hj";
[str count:str];


分类.m文件的内容:

@implementation NSString (CountNumber)
- (void)count:(NSString *)str{
int count = 0;
for (int i = 0; i < str.length; i++) {
unichar r = [str characterAtIndex:i];
if (r >= '0' && r <= '9') {
count++;
}
}
NSLog(@"%d", count);
}
@end


结果打印:

2015-10-06 12:01:12.673 OC-7-Category[1129:75684] 2
Program ended with exit code: 0


4. Extension:

延展/扩展/延展类别:匿名类别或者是类扩展,为一个类添加原来没有的变量及方法及合成属性

延展是category的特例 延展的分类名字为空 延展中的方法与成员变量是私有的(Private)

1. 在延展中可以声明实例变量:

2. 延展不能使用@implementation 类名()-----@end实现方法内容,直接在原类的.m里面,对方法进行实现

3. 定义私有的变量和方法

4. 延展的步骤:先写.h里面的东西:声明变量与方法---在原类的.m文件中实现方法内容

先在延展的.h文件中,声明实例变量及方法,然后在Man.m文件中写如下代码:实现延展

#import "Man.h"
@implementation Man
- (void)findGirl{
NSLog(@"girl...");
}

- (void)test{
[self findGirl];
}
- (void)run{
NSLog(@"running...");
}
@end


类扩展和类别的区别:

类扩展是在编译阶段被添加到类中的,类别是在运行阶段被添加到类中

类扩展所声明的方法必须依托对应类的实现部分来实现

定义在.m文件中的类扩展方法为私有的,定义在.h文件中的类扩展方法为公有的。。。

5. @protocol:

5.1 :基本用法及定义:

协议:用来声明一大堆方法,不能声明成员变量,

某个类遵守了某个协议,则这个类拥有了这个协议的所有方法声明

父类遵守某个协议,子类也遵守这个协议

可以同时遵守多个协议

只有一个头文件.h

步骤:

定义协议-->遵守协议-->实现协议中对应的方法

遵守协议:导入协议的头文件 ->遵守协议 ->实现方法

1> 定义协议:

@protocol 协议名称 <NSObject>

@end

2> 遵守协议:

@interface 类名:NSObject <协议名称1, 协议名称2....>

@end

3> 实现方法:在遵守本协议的类的.m文件中实现协议中的方法

5.2 @required @optional:

@required和@optional是协议方法声明中的关键字,控制方法是否实现

@required:这个方法必须实现,否则会报警告,

@optional:可以选择实现,不是必须的

5.3 Protocol类型限制:

@autoreleasepool {
Person *p = [Person new];
[p eat];
[p run];
Dog *dog = [Dog new];
// 第一种类型限制:给id类型加限制  id加某个协议的限制后,只能接受遵守这个协议的任意类对象进行赋值,
// 例:Dog *dog 是遵守了MyProtocol这个协议的,所以可以赋给obj
id<MyProtocol> obj1 = dog;

// 第二种类型限制:只能接受遵守MyProtocol协议的Person类的对象
Person<MyProtocol> *obj2 = p;

// 第三种类型限制:因为Person中的littleDog的类型是Dog<workProtocol> *littleDog; 所以dog也必须遵守workProtocol协议
obj2.littleDog = dog;

}


补充:id和instancetype的区别:

instancetype只能作为函数或者方法的返回值

id能作为方法或者函数的返回值、参数类型、也能用来定义变量

instancetype比id更能精确的限制返回值的具体类型

6. delegate:

协议的delegate设计模式(代理):自己懒得实现,找一个代理去遵守某些协议...

步骤:

定义一个协议,里面声明代理类(例:A)需要实现的方法列表

创建代理类,遵守上述协议

在需要代理的类(例:B)中,声明一个id类型 且遵守上述代理协议的成员变量

在B的实现文件中通过之前声明的id成员变量调用A遵守的协议方法

然后在主函数中,为B中代理类的成员变量赋值

例题:Baby和Nanny保姆之间的代理关系:

//  lookBabyProtocol协议文件内容:
#import <Foundation/Foundation.h>
@class Baby;
@protocol lookBabyProtocol <NSObject>
- (void)feedBabyEat:(Baby *)baby;
- (void)babySleep:(Baby *)baby;
@end

//  Baby.h
#import <Foundation/Foundation.h>
@class  Nanny;
#import "lookBabyProtocol.h"
@interface Baby : NSObject

@property (nonatomic,assign) float blood;
@property (nonatomic,assign) float sleep;
@property (nonatomic,strong) Nanny<lookBabyProtocol> *nanny;
- (void)wantEat;
- (void)wantSleep;
@end

//  Baby.m
#import "Baby.h"
#import "Nanny.h"
@implementation Baby
- (void)wantEat{
NSLog(@"baby is crying...");
[self.nanny feedBabyEat:self];
}
- (void)wantSleep{
NSLog(@"baby is crying...");
[self.nanny babySleep:self];
}
@end

//  Nanny.h
#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
@interface Nanny : NSObject<lookBabyProtocol>

@end

//  Nanny.m
#import "Nanny.h"
#import "Baby.h"
@implementation Nanny
- (void)feedBabyEat:(Baby *)baby{
baby.blood += 20;
NSLog(@"保姆正在喂宝宝吃饭,baby.blood = %.2f", baby.blood);
}
- (void)babySleep:(Baby *)baby{
baby.sleep += 10;
NSLog(@"保姆正在哄宝宝睡觉,baby.sleep = %.2f", baby.sleep);
}
@end


主函数调用:

int main(int argc, const char * argv[]) {
@autoreleasepool {
Nanny *n = [Nanny new];
Baby *b = [Baby new];

b.blood = 20;
b.sleep = 30;
b.nanny = n;

[b wantEat];
[b wantSleep];
NSLog(@"%.2f  %.2f", b.blood, b.sleep);
}
return 0;
}


结果打印显示:

2015-10-06 20:41:55.987 1005-protocol-delegate[2128:334828] baby is crying...
2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 保姆正在喂宝宝吃饭,baby.blood = 40.00
2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] baby is crying...
2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 保姆正在哄宝宝睡觉,baby.sleep = 40.00
2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 40.00  40.00
Program ended with exit code: 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: