Objective-C---7---NSDate Protocol Category
发布日期:2022-02-08 18:03:22 浏览次数:47 分类:技术文章

本文共 9436 字,大约阅读时间需要 31 分钟。

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 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 06:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 07:50:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:48 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-05 10:30:38 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-07 10:30:38 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 48.002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] hello worldhahaha2015-10-06 10:30:50.172 Lesson-OC-7-NSDate[789:40716] hahaha2015-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 +00002015-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 +0000Program 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] 2Program 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
obj1 = dog; // 第二种类型限制:只能接受遵守MyProtocol协议的Person类的对象 Person
*obj2 = p; // 第三种类型限制:因为Person中的littleDog的类型是Dog
*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 
@class Baby;@protocol lookBabyProtocol
- (void)feedBabyEat:(Baby *)baby;- (void)babySleep:(Baby *)baby;@end// Baby.h#import
@class Nanny;#import "lookBabyProtocol.h"@interface Baby : NSObject@property (nonatomic,assign) float blood;@property (nonatomic,assign) float sleep;@property (nonatomic,strong) Nanny
*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
#import "lookBabyProtocol.h"@interface Nanny : NSObject
@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.002015-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.002015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 40.00  40.00Program ended with exit code: 0

  

转载地址:https://blog.csdn.net/Evelynzn/article/details/48930709 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:UINavigationController
下一篇:Objective-C---6---Block

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月01日 19时28分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章