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

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





  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值