1 掌握NSDate的使⽤
2 掌握NSDateFormatter的使用3 掌握Category的定义和使用
4 掌握Extension的定义和使用5 掌握Protocol的定义和使用
6 掌握delegate的使用
内存五个区域对应的单词:
栈区 stack
堆区 heap
静态区 static global
常量区 constant
代码区 code
yy: 年的后2位
yyyy: 完整年
MM: 月,显示为1-12
MMM: 月,显示为英文月份简写,如 Jan
MMMM: 月,显示为英文月份全称,如 Janualy
dd: 日,2位数表示,如02
d: 日,1-2位显示,如 2
EEE: 简写星期几,如Sun
EEEE: 全写星期几,如Sunday
aa: 上下午,AM/PM
H: 时,24小时制,0-23
K: 时,12小时制,0-11
m: 分,1-2位
mm: 分,2位
s: 秒,1-2位
ss: 秒,2位
S: 毫秒
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)sayHi;
@end
Person.m
#import "Person.h"
//一个类的延展,现在是对Person类进行延展
//延展类的声明在.m文件里
@interface Person (){
//定义私有变量
NSString * _gender;
}
-(void)privateTest;
@end
@implementation Person
-(void)sayHi{
NSLog(@" wo jiao person");
//私有方法有可能是我们对外公开方法功能模块的一小部分
[self privateTest];
}
-(void)privateTest{
NSLog(@"这是一个私有方法");
}
@end
NSString+SayHi.h
#import <Foundation/Foundation.h>
@interface NSString (SayHi)
-(void)sayHi;
@end
NSString+SayHi.m
#import "NSString+SayHi.h"
@implementation NSString (SayHi)
-(void)sayHi{
NSLog(@"%@ say Hi",self);
}
@end
NSString+Invert.h
#import <Foundation/Foundation.h>
@interface NSArray (Invert)
-(void)reverseLogArray;
@end
NSString+Invert.m
#import "NSString+Invert.h"
@implementation NSArray (Invert)
-(void)reverseLogArray{
for (NSInteger i = [self count]-1; i>=0; i--) {
NSLog(@"%@",self[i]);
}
}
@end
MarryProtocol.h
#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>
//默认是required,有它修饰的方法必须实现
@required
-(void)makeMoney;
-(void)careMe;
-(void)cookie;
//@optional 有它修饰的实现与否都可以
@optional
-(void)doAll;
@end
Boy.h
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"
@interface Boy : NSObject<MarryProtocol>
@end
Boy.m
#import "Boy.h"
@implementation Boy
-(void)makeMoney{
NSLog(@"我会挣钱");
}
-(void)careMe{
NSLog(@"我会照顾人");
}
-(void)cookie{
NSLog(@"我会做饭");
}
-(void)doAll{
NSLog(@"我都会做");
}
@end
Girl.h
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"
//遵循协议语法:
@interface Girl : NSObject <MarryProtocol>{
//找一个男朋友
id<MarryProtocol> _boyFrind;
}
//上班
-(void)doWork;
//消费
-(void)shopping;
//吃饭
-(void)eat;
//撒娇
-(void)coquetry;
//感到幸福
-(void)feelHappy;
-(void)setBoyFriend:(id<MarryProtocol>)boyFriend;
-(id<MarryProtocol>)boyFriend;
@end
Girl.m
#import "Girl.h"
@implementation Girl
-(void)setBoyFriend:(id<MarryProtocol>)boyFriend{
_boyFrind=boyFriend;
}
-(id<MarryProtocol>)boyFriend{
return _boyFrind;
}
//上班
-(void)doWork{
NSLog(@"我是UI设计师,我在北京一家公司上班");
}
//消费
-(void)shopping{
NSLog(@"我没衣服穿了,想要去优衣库");
[_boyFrind makeMoney];
}
//吃饭
-(void)eat{
NSLog(@"我饿了");
[_boyFrind cookie];
}
//撒娇
-(void)coquetry{
NSLog(@"我会撒娇");
NSLog(@"受不了你了!");
}
//感到幸福
-(void)feelHappy{
NSLog(@"感到稳稳地幸福");
}
@end
man.h
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"
@interface Man : NSObject<MarryProtocol>
@end
man.m
#import "man.h"
@implementation Man
-(void)makeMoney{
NSLog(@"给你100W,花去吧");
}
-(void)careMe{
NSLog(@"去我的劳斯莱斯谈谈人生吧");
}
-(void)cookie{
NSLog(@"走,去吃满汉全席吧");
}
-(void)doAll{
NSLog(@"阿斯蒂芬");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "NSString+SayHi.h"
#import "NSString+Invert.h"
#import "Person.h"
#import "Girl.h"
#import "Boy.h"
#import "man.h"
int main(int argc, const char * argv[]) {
//-----1--NSDate -------
//NSDate的定义
NSDate * nowDate = [NSDate date];
//日期的加减运算 dateByAddingTimeInterval
nowDate = [nowDate dateByAddingTimeInterval:8 * 60 * 60];
NSLog(@"nowDate = %@",nowDate);
//获取系统当前的时间戳
NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval a=[dat timeIntervalSince1970]*1000;
NSString *timeString = [NSString stringWithFormat:@"%f", a];//转为字符型
//-----2--NSDateFormatter-------
//设置时间格式 时间转换为字符串格式
//NSDateFormatter的定义
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"dd/MM/yyyy HH:mm:ss "];
NSString *dateStr = [df stringFromDate:nowDate];
NSLog(@"dateStr = %@",dateStr);
//NSTimeInterval ⽤以表示以秒为单位的时间间隔,类型为double
NSDate * tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24];
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-60 * 60 * 24];
NSLog(@"%@",tomorrowDate);
NSLog(@"%@",yesterday);
NSTimeInterval ti = [tomorrowDate timeIntervalSinceDate:yesterday];
NSLog(@"ti = %.f s",ti);
/*
计算当前时间和⼀个固定时间的差值,如果差值在60秒内,输出“刚刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外,3600*24秒内,输出“xx小时前”
*/
NSDate * nd = [[NSDate alloc]init];
NSLog(@"nd = %@",nd);
NSDate * bd1 = [NSDate dateWithTimeIntervalSinceNow:50];
NSDate * bd2 = [NSDate dateWithTimeIntervalSinceNow:60*25];
NSDate * bd3 = [NSDate dateWithTimeIntervalSinceNow:60*60*25];
NSTimeInterval ti2 = [nd timeIntervalSinceDate:bd1];
NSTimeInterval ti3 = [nd timeIntervalSinceDate:bd2];
NSTimeInterval ti4 = [nd timeIntervalSinceDate:bd3];
NSLog(@"ti3 = %.f",ti3);
NSLog(@"ti4 = %.f",ti4);
if (ti2<=60) {
NSLog(@"刚刚");
}else if (ti2<=3600 && ti2 >60){
NSLog(@"%.f 分钟以内" ,ti2/60);
}else if (ti2<=3600*24 && ti2 >3600){
NSLog(@"%.f 小时内 ",ti2/3600);
}else{
NSLog(@"%.f 天之外",ti2/(3600*24));
}
//字符串转换为NSDate(转换后比原来小8个小时)
NSString * dateStr2 = @"2015*08*18_10";
NSDateFormatter * df2 = [[NSDateFormatter alloc]init];
[df2 setDateFormat:@"yyyy*MM*dd_HH-mm-ss"]; //这里格式要和字符串一模一样
//转换
NSDate * date = [df2 dateFromString:dateStr2];
NSLog(@"date = %@",date);
//获得当前时区
NSTimeZone * zone1 = [NSTimeZone systemTimeZone];
NSTimeZone * zone2 = [NSTimeZone timeZoneForSecondsFromGMT:8];
NSLog(@"zone1 = %@",zone1);
NSLog(@"zone2 = %@",zone2);
//获得所有时区
// NSArray * zones = [NSTimeZone knownTimeZoneNames];
// NSLog(@"zones = %@",zones);
//设置时区
[df2 setTimeZone:zone1];
NSLog(@"df2 = %@",df2);
/*
练习2
定义一个NSDateFormatter,设置合适的格式
将字符串@“2014年05月01日 10点23分18秒”转换为NSDate对象
*/
NSString * datestr3 = @"2014年05月01日 10点23分18秒";
NSDateFormatter * df3 = [[NSDateFormatter alloc]init];
[df3 setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
NSDate * date3 = [df3 dateFromString:datestr3];
NSLog(@"date3 = %@",date3);
//-----2--Category 类 类目-------
//类的扩展Category 叫分类也叫类目
//主要作用是为没有源代码的类添加方法,对原有类的一个扩展·
//通过Category添加的方法会成为原类的一部分
//优点:Category 不能完全替代继承,但能做许多继承做不了的事情,虽然写起来麻烦一点,但是用起来方便横多
//缺点:Category 只能扩展方法、消息,不能扩展字段、变量等。
/*
类和继承的区别
功能:Category 只能为类添加方法,而继承可以添加方法也可以添加实例变量
特点:Category 添加的类会成为原始类的一部分,能被子类继承;继承添加的类只有子类才有,父类不具有;
使用:
*/
NSString * str1 = @"学辉";
[str1 sayHi];
NSArray *arr1 = @[@"a",@"b",@"c",@"d",@"e",@"r"];
[arr1 reverseLogArray];
//-----3--Extension 延展-------
/*Category 和 Extension 的区别
作用:Category为没有源代码的类添加方法,Extension管理类的私有方法
格式:定义一对.h 和 .m Extension把代码写到原始类的.m文件中
*/
//创建一个person的实例
Person *p = [[Person alloc]init];
[p sayHi];
//-----4--Protocol 协议(谁遵守,谁实现)-------
Girl * girl1 = [[Girl alloc]init];
Boy * boy1 = [[Boy alloc]init];
NSLog(@"girl1 = %@",girl1);
NSLog(@"boy1 = %@",boy1);
// [boy1 makeMoney];
// [boy2 careMe];
// [boy3 cookie];
// [boy4 doAll];
//-----5--delegate 设计模式-----------
//Protocol的核心使用场景是实现delegate设计模式,凡是默写任务自己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理帮去做。只要通知代理去做某事就行。
//现在公司有一个女孩子
Girl * girl2 = [[Girl alloc]init];
[girl2 doWork];
//公司又来了一个男孩子
Boy * boy2 = [[Boy alloc]init];
//这个男孩子对女孩子很好,然后他们在一起了
[girl2 setBoyFriend:boy2];
//当女孩饿了,男孩会给她做饭
[girl2 eat];
//当女孩要去购物了,男孩会给他好多钱
[girl2 shopping];
//当女孩给男孩撒娇的时候
[girl2 coquetry];
//---这个男孩子太。。。了,她终于忍受不了对方,分开了,这时候来了一个成熟稳重的男人,这个男人对她挺好
Man * man = [[Man alloc]init];
[girl2 setBoyFriend:man];
//当女孩饿了,男孩会给她做饭
[girl2 eat];
//当女孩要去购物了,男孩会给他好多钱
[girl2 shopping];
//当女孩给男孩撒娇的时候
[girl2 coquetry];
return 0;
}