博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oc NSDate、类的扩展 、代理(家庭-保姆)
阅读量:5826 次
发布时间:2019-06-18

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

  hot3.png

⼀、NSDate

1、⺴络请求中的时间戳

     计算当前时间距离1970年1⽉1⽇

2、关于时区

24个时区  北京东八区

NSDate输出的永远是0时区的时间 英国

格林尼治时间 GMT Greenwich Mean Time

3、NSDate使用

    // 创建日期:表示当前的时间

    NSDate * nowDate = [NSDate date];

   

    // 创建日期:以当前时间为参考点,创建表示昨天这个时间的日期对象

    double oneDay = 24*3600;

    NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-oneDay];
   
NSDate * since2001 = [NSDate dateWithTimeIntervalSinceReferenceDate:0];
   
NSDate * since1970 = [NSDate dateWithTimeIntervalSince1970:0];
   
NSDate * sinceAnyDay = [NSDate dateWithTimeInterval:oneDay sinceDate:since2001];
   
// NSTimeInterval double类型
   
NSTimeInterval interval = [sinceAnyDay timeIntervalSinceDate:since2001];
   
   
// 获取时间戳: 当前时间距离1970之间的时间差

    NSTimeInterval time = [[NSDate date] timeIntervalSince1970];

⼆、掌握NSDateFormatter的使⽤

#pragma mark -- NSDateFormatter 日期格式化类 --

    // NSDate to NSString
   
NSDateFormatter * format1 = [[NSDateFormatter alloc] init];
   
// 设定格式
   
// y M d 小时h(1-12 am/pm) H(0-23) m s z时区
    [format1
setDateFormat:@"y-M-d h:m:s MMMM zzzz"];
   
NSString * str1 = [format1 stringFromDate:[NSDate date]];
   
   
// NSString to Date
   
NSString * timeStr = @"201451 102322";
   
NSDateFormatter * format2 = [[NSDateFormatter alloc] init];
    [format2
setDateFormat:@"yMd hms"];

    NSDate * date = [format2 dateFromString:timeStr];

三、类目Category的定义和使⽤

1、类目的作用

为原始的类扩展新的方法,扩展的方法会成为原始类的一部分,亦可被子类继承

2、创建文件

Command+N -> source -> Objective-c File ->

File:Addition

File Type:Category

Class:NSString

3、类目的使用

NSString+Addition.h

// 类目的接口部分

// 类目通常是给没有源代码的类添加新的方法。备注:不能添加实例变量!!!

@interface NSString (Addition)

- (NSUInteger)length;     // Never do It! 可以但绝对不允许在类目中重新实现已经定义的方法.  //因为类目中方法的优先级高于源代码中的方法(但系统方法除外[有保护])

- (void)str_sayHi;     // 推荐:类目的方法名加前缀

@end

NSString+Addition.m

// 类目的实现部分

@implementation NSString (Addition)

- (void)str_sayHi

{
    // 在实例方法中,self表示调用这个方法的对象
   
NSLog(@"%@", self);

}

@end

四、Extension(延展)

延展是匿名的类目

延展的作用

 延展要写在.m文件中,主要作用是管理私有方法

优点

 外部声明与内部延展区分开,提高代码质量,提高可读性。方便管理

使用

 .h文件是提供类的外部使用的; .m是类自己使用的,不对外公开。

 延展只有接口部分,没有实现部分。在类的实现部分实现延展的方法

Person.m:

@interface Person ()

{
    NSString * _gender;

}

// 自我介绍

- (void)introduce;

// 不要以_开头,_是系统类用的

- (void)p_sayHello;

@end

@implementation Person

- (void)sayHi

{
    [self introduce];

}

- (void)introduce

{
    NSLog(@"Extension: introduce method");

}

- (void)p_sayHello

{
    NSLog(@"Hello Extension");

}

@end

五、Protocol(协议)

1、定义协议

协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。

Command+N -> source -> Objective-c File ->

File:MarryProtocol

File Type:Protocol

@protocol MarryProtocol <NSObject>

// 必须实现(默认)

@required     

- (void)makeMoney;

// 可选实现

@optional     

- (void)cook;

- (void)wash;

@end

2、遵守协议

分两步:

1、在类的.h⽂件 ⽗类名后写上<协议名>。

2、在.m⽂件中实现协议中的⽅法。

Boy.h:

#import <Foundation/Foundation.h>

#import "MarryProtocol.h"

@interface Boy : NSObject <MarryProtocol>

@end

Boy.m:

#import "Boy.h"

@implementation Boy

- (void)makeMoney

{
    NSLog(@"boy makeMoney");

}

- (void)wash

{
    NSLog(@"boy wash");

}

- (void)cook

{
    NSLog(@"boy cook");

}

@end

     承上

协议作用:解耦合

Protocol的核⼼使⽤场景是实现delegate设计模式。

协议方法<==>委托方法

     启下

六、delegate

代理设计模式内容

找代理的对象(家庭),作为代理的对象(保姆)

代理设计模式实现

(1)找代理的对象(家庭)定义协议,协议中是代理对象(保姆)需要实现的方法

(2)作为代理的对象(保姆)要遵守协议,实现协议方法

(3)设置代理对象

家庭类,保姆类  让保姆对象作为家庭的代理,实现:看小孩、做饭

FamilyProtocol.h

@protocol FamilyProtocol <NSObject>

@required

- (void)cook;
@optional
- (
void)lookAfterBaby;

@end

Housemaid.h

#import "FamilyProtocol.h"

@interface Housemaid : NSObject <FamilyProtocol>

@end

Housemaid.m

@implementation Housemaid

- (void)lookAfterBaby{

 

    NSLog(@"Housemaid take care of Baby");

}

- (void)cook{

    NSLog(@"Housemaind cook.");

}

@end

Family.h

#import "FamilyProtocol.h"

#import "Housemaid.h"

@interface Family : NSObject{

    Housemaid<FamilyProtocol> * _delegate;

}
#pragma mark -- delegatesetter方法 --

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

- (void)hungry;

- (void)cry;

@end

Family.m

@implementation Family

#pragma mark -- delegatesetter方法 --
- (void)setDelegate:(id<FamilyProtocol>)delegate
{
   
_delegate = delegate;

}

- (void)hungry

{
    NSLog(@"Hungry!");
   
if ([_delegate respondsToSelector:@selector(cook)]) {
        [
_delegate cook];
    }
}
- (
void)cry
{
   
NSLog(@"The baby is crying");
   
if ([_delegate respondsToSelector:@selector(lookAfterBaby)]) {
        [
_delegate lookAfterBaby];
    }
}

@end

main.m

...

Housemaid * h = [[Housemaid alloc] init];

Family * f = [[Family alloc] init];

[f setDelegate:h];

[f hungry];

[f cry];

...

扩展类的四种方法:1:类目、2:延展、3:协议、4:子类(、5:修改源代码)

转载于:https://my.oschina.net/zooyf/blog/489827

你可能感兴趣的文章
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
hive基本操作与应用
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>