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:修改源代碼)

相關文章
相關標籤/搜索