随意细解:OC -- NSData、Category、Extension、Protocol

系统中表示时间日期的类—-NSDate

NSDate打印时,描述方法默认打印0时区,所以时差为8小时

初始化方法:

  • 初始化一个现在的时间

    NSDate *date = [NSDate date];
    
  • 初始化一个时间,为距离现在 n 秒之后的时间日期 (n = 3600 * 24)

    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600 * 24];
    

    例如:昨天

    NSDate date = [NSDate dateWithTimeIntervalSinceNow: - 3600 24];

  • 初始化一个时间,为距离2001-1-1 00:00:00 n秒之后的时间 (n = 3600 )

    NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];
    
  • 初始化一个时间,为距离1970-1-1 00:00:00 n秒之后的时间 (n = 3600)

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:3600];
    

把 NSDate 转化为 NSString 格式输出:

  1. 步骤1.初始化一个日期

    NSDate *D = [NSDate date];  
    
  2. 初始化一个日期格式对象

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    
  3. 添加一个格式

    [formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
    
  4. 新建一个NSTimeZone,设置时区差为 0 (设置后不会有8小时的差)

     NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    
  5. 在格式中设置NSTimeZone

    [formatter setTimeZone:zone];
    
  6. 新建字符串,接收Date转换后的结果,并输出

    NSString *str = [formatter stringFromDate:D];
    NSLog(@"%@",str);
    

把 NSDate 转化为 NSString 格式输出:

  1. 初始化一个时间的字符串

    NSString *str = @"2014年05月01日 10点23分18秒";
    

步骤2-5.同上

  1. 新建 NSDate 接收NSString转换后的Date,并输出

    NSDate *D = [formatter dateFromString:str];
    NSLog(@"%@",D);
    

类目—- Category

特点:可以给看不到实现的系统类添加方法,并且添加的方法。使用系统类的对象或者类名直接可以调用。 切记:只能添加方法,不能添加实例变量。类目中添加的方法,相当于直接添加到系统类中,是可以被继承的。

例:给 NSDate 类添加 dataWithDateString 方法,将字符串转化为 NSDate 格式
新建一个Objective-C File ,File Type 选为Category ,Class的选择系统已有的类,这里举例为:NSDate 。

  1. 在 .h 文件中声明类方法:

    (NSDate *)dataWithDateString:(NSString *)str;
    
  2. 在 .m 文件中写方法的实现:

     (NSDate *)dataWithDateString:(NSString *)str
    {
        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
        [formatter setDateFormat:@"yyyyMMddHHmmss"];
        NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];
        [formatter setTimeZone:zone];
        NSDate *date = [formatter dateFromString:str];
        return date;
    }
    
  3. 在 main.m 文件中调用:(记得导入头文件)

    NSString *string = @"20140402142850";
    NSLog(@"%@",[NSDate dataWithDateString:string]);
    

延展—- Extension

  • 方法一:

    1.在 .m 文件的中写 @interface 类名 ()

    @interface 类名 ()
    

    2.在 @interface 和 @end 之间声明方法

    @interface 类名 ()
    
    - (void)sayHi;
    
    @end
    

    3.在 @implementation 和 @end 之间写私有方法的实现

    @implementation 类名
    
    - (void)sayHi
    {
        NSLog(@"sayHi");
    }
    
    @end
    
  • 方法二:

    延展中可以写实例变量和方法,并且是私有的实例变量和方法申明。
    特点:一定要给有源代码的类创建延展,要不然毫无意义。并且声明的私有方法,需要去原类的.m文件中实现

    1.新建一个Objective-C File ,File Type 选为Extension ,Class的选择自己定义的类。在 .h 文件中声明方法。

    @interface 类名 ()
    
    - (void)sayHi;
    
    @end
    

    2.在类中导入头文件,在 .m 文件中写私有方法的实现

    @implementation 类名
    
    - (void)sayHi
    {
        NSLog(@"sayHi");
    }
    
        @end
    

代理—- Protocol

使用协议代理的步骤:

  1. 先创建协议

    新建一个Objective-C File ,File Type 选为Protocol 。例子为:MarryProtocol
    协议中 @required 为必须要实现的方法(也是默认的)。@optional 为可选择的实现。

    @required   // 必须要实现的(也是默认的)
    - (void)makeMoney;
    
    @optional    // 可选择实现的
    - (void)makeCook;
    
  2. 遵守协议

    在代理的类 .h 文件中:导入Protocol协议的头文件。例子为 Boy类
    在@interface 类名 :NSObject

    @interface Boy : NSObject <MarryProtocol>  // 遵守协议
    
  3. 实现协议中方法

    在 Boy.m 文件中写协议中必须要写的方法

    // 实现协议中的方法
    - (void)makeMoney
    {
        NSLog(@"我去挣钱");
    }
    
    - (void)makeCook
    {
        NSLog(@"好,我去做饭了");
    }
    
  4. 添加代理对象为实例变量 (谁需要代理 就在那个类里声明实例变量)

    在 Girl.h 文件中,导入协议的有文件

    #import "MarryProtocol.h"
    

    将代理对象作为实例变量。代理对象必须是遵守协议的对象

    @interface Girl : NSObject
    {
       id<MarryProtocol> _delegate;
    }
    
  5. 添加设置代理对象的方法(set方法)

    在 Girl.h 文件中声明set方法:

    - (void)setDelegate:(id<MarryProtocol>)delegate;
    

    在 Girl.m 文件中实现set方法:

    // 添加设置代理的方法set
    - (void)setDelegate:(id<MarryProtocol>)delegate
    {
        _delegate = delegate;
    }
    
  6. 让代理去干活(让代理去调用协议中的方法)

    在 Girl.m 文件的实现方法中调用代理

    - (void)hungry
    {
    
        NSLog(@"我是女的,肚子饿了");
    
     // 需要 你给她做饭
     // 需要 代理去做饭
     // 需要 代理去调用做饭的方法
     // 需要 代理的对象去调用协议中的方法(因为代理对象实现了代理的方法)
    
     // 让代理去调用协议中的方法
     // 判断一下 代理有没有实现这个方法
     // respondsToSelector 方法 判断这个类中有没有实现某个方法 返回一个BOOL值
     // 让代理去调用方法的一个安全保护
     if ([_delegate respondsToSelector:@selector(makeCook)]) {
         [_delegate makeCook];
     }
    }
    
  7. 从main函数创建对象 设置代理对象

    在 main.m 中调用。首先导入 Boy.h 和 Girl.h ,创建 Boy 、Girl 对象,设置代理

    Boy *b = [[Boy alloc]init];
    
    Girl *g = [[Girl alloc]init];
    
    // 设置代理
    [g setDelegate:b];
    
    [g hungry];
    

    运行结果:

    2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 我是女的,肚子饿了
    2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 好,我去做饭了
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值