本文共 9436 字,大约阅读时间需要 31 分钟。
1. NSDate:
用来获取时间 或者计算时间
NSTimeinterval:(即ouble类型)以秒为单位
/* NSDate 是objC中提供日期处理的一个类: 获取当前时间 计算时间 格式化显示时间 日期对象的使用 */#pragma 计算时间: { // 获取当前时间:显示的是0时区的时间 NSDate *date = [NSDate date]; NSLog(@"%@", date); // 获取本地时间:相当于加8小时 NSDate *now1 = [NSDate dateWithTimeIntervalSinceNow:6 * 40 * 60]; // 乘积结果单位是秒 NSLog(@"%@",now1); NSDate *now2 = [NSDate dateWithTimeIntervalSinceNow:8 * 40 * 60]; NSLog(@"%@",now2); NSDate *now3 = [NSDate dateWithTimeIntervalSinceNow:8 * 00 * 60]; NSLog(@"%@",now3); NSDate *now4 = [NSDate dateWithTimeIntervalSinceNow:8 * 40 * 00]; NSLog(@"%@",now4); NSDate *now5 = [NSDate dateWithTimeIntervalSinceNow:10 * 1* 1]; NSLog(@"%@",now5); NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:8 * 60 * 60 - 24 * 60 * 60]; NSLog(@"%@",yesterday); NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:8 * 60 * 60 + 24 * 60 * 60]; NSLog(@"%@",tomorrow); NSTimeInterval interval1 = [tomorrow timeIntervalSinceDate:yesterday]; NSLog(@"%.2f", interval1 / 3600); // 微信聊天:接收信息--记录接收时间--发送信息--记录时间--计算时间差 NSLog(@"hello world"); NSDate *get = [NSDate date]; char ch[200] = {0}; scanf("%s", ch); // 将C语言字符串 转换为OC对象 NSString *message = [NSString stringWithUTF8String:ch]; NSLog(@"%@", message); NSDate *send = [NSDate date]; NSTimeInterval interval2 = [send timeIntervalSinceDate:get]; if (interval2 < 60) { NSLog(@"刚刚"); }else if (interval2 > 60 && interval2 < 3600){ NSLog(@"分钟:%.2f", interval2 / 60); } }
打印结果显示:
打印出hello world之后,需要输入东西:
2015-10-06 10:30:38.597 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 06:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 07:50:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:38 +00002015-10-06 10:30:38.598 Lesson-OC-7-NSDate[789:40716] 2015-10-06 02:30:48 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-05 10:30:38 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 2015-10-07 10:30:38 +00002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] 48.002015-10-06 10:30:38.599 Lesson-OC-7-NSDate[789:40716] hello worldhahaha2015-10-06 10:30:50.172 Lesson-OC-7-NSDate[789:40716] hahaha2015-10-06 10:30:50.172 Lesson-OC-7-NSDate[789:40716] 刚刚Program ended with exit code: 0
将C语言字符串 转换为OC对象: NSString *message = [NSString stringWithUTF8String:ch];
2. NSDateFormatter
2.1 格式化显示时间:
日期格式: yyyy 年 MM 月 dd 天 HH 24小时制 hh 12小时制 mm 分钟 ss 秒数
#pragma 格式化显示时间: { // 格式化日期:按照需求呈现出内容: NSDate *date = [NSDate date]; NSLog(@"%@", date); NSDateFormatter *myFor = [[NSDateFormatter alloc] init]; myFor.dateFormat = @"yyyy年MM月dd日 EEEE GGGG aaaa hh:mm:ss"; NSString * da = [myFor stringFromDate:date]; NSLog(@"%@", da); [myFor release]; }打印结果显示:
2015-10-06 10:29:26.704 Lesson-OC-7-NSDate[780:40180] 2015-10-06 02:29:26 +00002015-10-06 10:29:26.705 Lesson-OC-7-NSDate[780:40180] 2015年10月06日 星期二 公元 上午 10:29:26
NSDateFormatter这个类型就是固定你的时间显示格式而已:
stringFromDate:将时间转换为用户要求的显示格式(字符串)
dateFromString:将字符串转换为时间(下一个例题会用到)
2.2 日期时间对象的使用
#pragma 日期时间对象的使用 { // 将日期的字符串转换为日期对象:NSString转换为NSDate // 1. 创建包含日期信息的字符串: NSString *p= @"2015年10月6日 9点58分50秒"; // 2. 创建格式化日期对象: NSDateFormatter *forma = [[NSDateFormatter alloc] init]; // 3. 设置日期转换格式: [forma setDateFormat:@"yyyy年MM月dd日 hh点mm分ss秒"]; // 4. 转换 NSDate *date= [forma dateFromString:p]; NSLog(@"%@", date); [forma release]; }打印结果显示:
2015-10-06 10:33:21.391 Lesson-OC-7-NSDate[797:41650] 2015-10-06 01:58:50 +0000Program ended with exit code: 0
3. Category:
category:人称(分类/类目/类别/类扩展) category:包含方法的声明和方法的实现(.h和.m) 分类的作用: 1. 在不修改原有类的基础下,给类增加新的功能 2. 一个大的类可以分模块开发,多人进行编写 分类的目的: 1. 对现有类进行扩展:子类也可以继承分类 2. 作为子类的替代手段: 3. 对类中的方法归类: 使用分类的步骤: 1. 声明分类: @interface 类名(分类名称) @end 2. 实现分类: @implementation 类名(分类名称) @end 3. 使用分类:
#pragma 在原有的类中添加分类 { Person *p = [[Person alloc] init]; [p run]; #pragma 使用单独的文件创建Category [p playDota]; [p studyC]; #pragma 使用分类的注意事项: // 1. 在分类中不可以声明实例变量 // 2. 在分类中可以访问原类的实例变量 // 3. 在分类中存在和原类同名的方法 分类方法优先级 > 原类方法优先级 // 4. 多个分类中的同名方法:最后编译的分类方法 > 其他分类方法 [p eat]; // 先调用分类的方法 #pragma 非正式协议 // 非正式协议:就是类别Category 凡是给NSObject及其Foundation框架中的子类添加的分类,就是非正式协议 [p uninstallLOL]; [p release]; Student *student = [Student new]; [student uninstallLOL]; }
#pragma 练习题:判断字符串中数字的个数,要求所有的字符串都具有这个方法 继承于NSString
#pragma 练习题:判断字符串中数字的个数,要求所有的字符串都具有这个方法 继承于NSString// 定义字符串--循环遍历--提取字符串中的每个字符--判断是否是数字--修改计数值--输出结果 NSString *str = @"dfghj48hj"; [str count:str];分类.m文件的内容:
@implementation NSString (CountNumber)- (void)count:(NSString *)str{ int count = 0; for (int i = 0; i < str.length; i++) { unichar r = [str characterAtIndex:i]; if (r >= '0' && r <= '9') { count++; } } NSLog(@"%d", count);}@end结果打印:
2015-10-06 12:01:12.673 OC-7-Category[1129:75684] 2Program ended with exit code: 0
4. Extension:
延展/扩展/延展类别:匿名类别或者是类扩展,为一个类添加原来没有的变量及方法及合成属性
延展是category的特例 延展的分类名字为空 延展中的方法与成员变量是私有的(Private)
1. 在延展中可以声明实例变量:2. 延展不能使用@implementation 类名()-----@end实现方法内容,直接在原类的.m里面,对方法进行实现
3. 定义私有的变量和方法
4. 延展的步骤:先写.h里面的东西:声明变量与方法---在原类的.m文件中实现方法内容
先在延展的.h文件中,声明实例变量及方法,然后在Man.m文件中写如下代码:实现延展
#import "Man.h"@implementation Man- (void)findGirl{ NSLog(@"girl...");}- (void)test{ [self findGirl];}- (void)run{ NSLog(@"running...");}@end
类扩展和类别的区别:
类扩展是在编译阶段被添加到类中的,类别是在运行阶段被添加到类中
类扩展所声明的方法必须依托对应类的实现部分来实现
定义在.m文件中的类扩展方法为私有的,定义在.h文件中的类扩展方法为公有的。。。
5. @protocol:
5.1 :基本用法及定义:
协议:用来声明一大堆方法,不能声明成员变量,
某个类遵守了某个协议,则这个类拥有了这个协议的所有方法声明
父类遵守某个协议,子类也遵守这个协议
可以同时遵守多个协议
只有一个头文件.h
步骤:
定义协议-->遵守协议-->实现协议中对应的方法
遵守协议:导入协议的头文件 ->遵守协议 ->实现方法
1> 定义协议:
@protocol 协议名称 <NSObject>
@end
2> 遵守协议:
@interface 类名:NSObject <协议名称1, 协议名称2....>
@end
3> 实现方法:在遵守本协议的类的.m文件中实现协议中的方法
5.2 @required @optional:
@required和@optional是协议方法声明中的关键字,控制方法是否实现
@required:这个方法必须实现,否则会报警告,
@optional:可以选择实现,不是必须的
5.3 Protocol类型限制:
@autoreleasepool { Person *p = [Person new]; [p eat]; [p run]; Dog *dog = [Dog new];// 第一种类型限制:给id类型加限制 id加某个协议的限制后,只能接受遵守这个协议的任意类对象进行赋值,// 例:Dog *dog 是遵守了MyProtocol这个协议的,所以可以赋给obj id补充:id和instancetype的区别:obj1 = dog; // 第二种类型限制:只能接受遵守MyProtocol协议的Person类的对象 Person *obj2 = p; // 第三种类型限制:因为Person中的littleDog的类型是Dog *littleDog; 所以dog也必须遵守workProtocol协议 obj2.littleDog = dog; }
instancetype只能作为函数或者方法的返回值
id能作为方法或者函数的返回值、参数类型、也能用来定义变量
instancetype比id更能精确的限制返回值的具体类型
6. delegate:
协议的delegate设计模式(代理):自己懒得实现,找一个代理去遵守某些协议...
步骤:
定义一个协议,里面声明代理类(例:A)需要实现的方法列表
创建代理类,遵守上述协议
在需要代理的类(例:B)中,声明一个id类型 且遵守上述代理协议的成员变量
在B的实现文件中通过之前声明的id成员变量调用A遵守的协议方法
然后在主函数中,为B中代理类的成员变量赋值
例题:Baby和Nanny保姆之间的代理关系:
// lookBabyProtocol协议文件内容:#import主函数调用:@class Baby;@protocol lookBabyProtocol - (void)feedBabyEat:(Baby *)baby;- (void)babySleep:(Baby *)baby;@end// Baby.h#import @class Nanny;#import "lookBabyProtocol.h"@interface Baby : NSObject@property (nonatomic,assign) float blood;@property (nonatomic,assign) float sleep;@property (nonatomic,strong) Nanny *nanny;- (void)wantEat;- (void)wantSleep;@end// Baby.m#import "Baby.h"#import "Nanny.h"@implementation Baby- (void)wantEat{ NSLog(@"baby is crying..."); [self.nanny feedBabyEat:self];}- (void)wantSleep{ NSLog(@"baby is crying..."); [self.nanny babySleep:self];}@end// Nanny.h#import #import "lookBabyProtocol.h"@interface Nanny : NSObject @end// Nanny.m#import "Nanny.h"#import "Baby.h"@implementation Nanny- (void)feedBabyEat:(Baby *)baby{ baby.blood += 20; NSLog(@"保姆正在喂宝宝吃饭,baby.blood = %.2f", baby.blood);}- (void)babySleep:(Baby *)baby{ baby.sleep += 10; NSLog(@"保姆正在哄宝宝睡觉,baby.sleep = %.2f", baby.sleep);}@end
int main(int argc, const char * argv[]) { @autoreleasepool { Nanny *n = [Nanny new]; Baby *b = [Baby new]; b.blood = 20; b.sleep = 30; b.nanny = n; [b wantEat]; [b wantSleep]; NSLog(@"%.2f %.2f", b.blood, b.sleep); } return 0;}结果打印显示:
2015-10-06 20:41:55.987 1005-protocol-delegate[2128:334828] baby is crying...2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 保姆正在喂宝宝吃饭,baby.blood = 40.002015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] baby is crying...2015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 保姆正在哄宝宝睡觉,baby.sleep = 40.002015-10-06 20:41:55.989 1005-protocol-delegate[2128:334828] 40.00 40.00Program ended with exit code: 0
转载地址:https://blog.csdn.net/Evelynzn/article/details/48930709 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!