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

⼀、NSDate设计模式

一、⺴络请求中的时间戳ui

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

二、关于时区设计

24个时区  北京东八区代理

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

格林尼治时间 GMT Greenwich Mean Time对象

三、NSDate使用继承

    // 建立日期:表示当前的时间
   
NSDate * nowDate = [NSDate date];接口

   

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

    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];

3、类目Category的定义和使⽤

一、类目的做用

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

二、建立文件

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

File:Addition

File Type:Category

Class:NSString

三、类目的使用

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

4、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

5、Protocol(协议)

一、定义协议

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

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

File:MarryProtocol

File Type:Protocol

@protocol MarryProtocol <NSObject>

// 必须实现(默认)

@required     

- (void)makeMoney;

// 可选实现

@optional     

- (void)cook;

- (void)wash;

@end

二、遵照协议

分两步:

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

二、在.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设计模式。

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

     启下

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

相关文章
相关标签/搜索