oc NSDate、类的扩展 、代理(家庭-保姆)

自作多情 提交于 2019-12-04 16:48:48

⼀、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:修改源代码)


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!