⼀、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 = @"2014年5月1日 10點23分22秒";
NSDateFormatter * format2 = [[NSDateFormatter alloc] init];
[format2 setDateFormat:@"y年M月d日 h點m分s秒"];
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 -- delegate的setter方法 --
- (void)setDelegate:(id<FamilyProtocol>)delegate;
- (void)hungry;
- (void)cry;
@end
Family.m
@implementation Family
#pragma mark -- delegate的setter方法 --
- (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:修改源代碼)