OC (七)

<span style="font-size:18px;">NSDate 和NSDateFormatter</span>
<span style="font-size:18px;">
NSDate是Cocoa中用于处理日期和时间的基础类,封装了某一给定的时刻,具体日期时间和时区。
无论你是哪个时区的时间,打印时总是打印对应的时区对应的0时区时间。
例如:NSDate *nowDate = [NSDate date];
   NSDateFormatter 的使用

 NSDateFormatter是iOS中的日期格式类,主要功能是实现代表日期


常见的时间格式化字符串有以下一些:y年。M年中的月份 d月份中的天数。H 一天中的小时数(0-23)h  am / pm中的小时数(1-12)m小时中的分钟数s分钟中的秒数。


指定日期格式
NSDateFromatter  *formatter = [NSDateFormatter alloc] init];
[formatter setDateFormat:@“yyy-MM-dd HH:mm:ss”];


类目
Category 也叫分类 或类目
主要作用是为没有源代码的类添加方法,
通过Category添加的方法会成为原类的一部分。从而达到扩展一个类的功能。
Category 与子类的区别
Category	Subclass
功能	只能为类添加方法	既能为类添加方法还可以添加变量
特点	新添加的方法会成为原始类的一部分,能被子类继承	新添加的方法只有子类才有,父类不具有
使用	使用原始类的实例(如果是-方法)或者原始类(如果是+方法)调用方法	子类才能调用,如果在项目开发到尾声的时候使用子类添加了方法,需要对已写代码做类型替换(将父类替换为子类)Category和Extension的区别
category	entension
作用	为没有源代码的类添加方法	管理类的私有方法
格式	定义一对.h  和.m	把代码写到原始类的.m文件中

Protocal


 协议是一套标准(一堆方法的声明)只有h文件。
接受协议的对象实现协议中定义的方法。
协议就像一张任务清单(或便利贴),上面写了一对才需要处理的事,清单交给谁,谁就要去完成清单上规定的任务。
协议定义好之后,需要有类去遵守这个协议,实现协议里的方法。
遵守协议即在.h文件的父类名后写上<协议名>。实现协议的方法即在.m文件中实现协议中的方法。相当于给这和类添加了图若干个方法。这个类的实例就可以调用这些方法。
类的扩展的四种:继承 category(针对系统类) extension (针对自定义类做扩展)protocol(针对可以看到.m文件的类)。



Protocol的核心使用场景是实现Delegate设计模式。


Delegate设计模式
代理 使用场景:
凡是某些任务自己不去实现,想让别人去实现的时候,就可以指定一个代理,让代理去做。你只需要通知代理去做某事。
练习3 
建立一个保姆协议。包带孩子做饭等方法。
建立一个母亲类,母亲有一个id delegate
分别让医生学生 老师做代理,实现协议的方法。
总结:
NSDate 是iOS中表示日期的类。可以使用NSDateFormatter 控制 NSString 和NSDate 的互转。
Category能为没有源代码的类添加方法。
Extension为类管理私有方法
Protocol和代理通常联合使用,是ios中特别重要的语法
// 创建一个标准零时区的时间对象
    NSDate *currentDate = [NSDate date];
    NSLog(@"%@",currentDate);
    //根据时间间隔获得过去或者未来的某个时间点的事件对象
    
    NSDate *preDate = [[NSDate alloc]initWithTimeIntervalSinceNow:-3600];
    NSLog(@"%@",preDate);
    NSDate *futDate = [[NSDate alloc]initWithTimeIntervalSinceNow:3600];
    NSLog(@"%@",futDate);
    //得到两个时间对象的时间间隔
    NSTimeInterval timeInterval = [preDate timeIntervalSinceDate:futDate];
    NSLog(@"%f",timeInterval);
    //通过时间间隔得到指定的事件对象与1970年的标准时间点做比较
    NSDate *newDate =[NSDate dateWithTimeIntervalSince1970:799999999];
    NSLog(@"%@",newDate);
    NSLog(@"-----------------------------");
    NSDate *gdDate = [NSDate dateWithString:@"2014-07-25 3:48:15 +0000"];
    NSTimeInterval time1 = [gdDate  timeIntervalSinceDate:currentDate];
    if (time1 < 60) {
        NSLog(@"刚刚");
    }
    else if (time1 >= 60 && time1 < 3600){
        NSLog(@"%d分钟前",(int)time1/60);
    }
    else if(time1 >= 3600 &&time1 < 3600*24){
        NSLog(@"%d小时前",(int)time1/3600);
    }
    
     //-----------NSDateFormatter-----------
    //NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    //使用系统提供的日期时间格式来格式化输出日期对象
    
     NSDateFormatterNoStyle = kCFDateFormatterNoStyle,
     NSDateFormatterShortStyle = kCFDateFormatterShortStyle,
     NSDateFormatterMediumStyle = kCFDateFormatterMediumStyle,
     NSDateFormatterLongStyle = kCFDateFormatterLongStyle,
     NSDateFormatterFullStyle = kCFDateFormatterFullStyle
     
//    [formatter setDateStyle:NSDateFormatterNoStyle];
//  [formatter setDateStyle:NSDateFormatterFullStyle];
//    [formatter setTimeStyle:NSDateFormatterFullStyle];
    
  [formatter setDateStyle:NSDateFormatterFullStyle];
    // 通过formatter 将指定的date对象转换成指定格式的时间字符串
    [formatter setDateFormat:@"yyyy年MM月dd日 a hh时mm分ss秒 EEE"];
    //为formatter对象设置时区
    NSLog(@"%@",[NSTimeZone knownTimeZoneNames]);
    
    [formatter  setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
    NSDate *currentDate1 = [NSDate date];
    //通过formatter   将指定的date对象转换成指定格式的时间字符串
    NSString *timeStr = [formatter stringFromDate:currentDate1];
//    NSLog(@"%@",timeStr);
    [formatter setDateFormat:@"yyyyMMddHHmm"];
    NSString *string = @"201407051206";
    NSDate *strDate =[formatter dateFromString:string];
    NSLog(@"strDate= %@",strDate);
     NSLog(@"%@",timeStr);
    NSString *string1 = @"Duke";
    [string1 sayHello];
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"4",@"3",@"a2",@"7" ,nil];
    [array bubbleSortUsingBlock:^BOOL(id obj1, id obj2) {
        BOOL result = [obj1 isKindOfNumberCharacters];
        if (result) {
            NSLog(@"%@=YES",obj1);
        }else{
            NSLog(@"%@=NO",obj1);
        }
        int number1 = [obj1 intValue];
        int number2 = [obj2  intValue];
        if (number1 > number2) {
            return YES;
        }
        return NO;
    }];
    NSLog(@"%@",array);
    
    NSString *string2 = @"20140402142850";
    NSDate  *date = [NSDate dateWithDateString:string2];
    NSLog(@"%@",date);
    
    
    //------------------------------------------
  NSString *str = @"2014年01月02日14点28分50秒";
    NSString *formateStr = @"yyy年MM月dd日HH点mm分ss秒";
    NSDate *date1 = [NSDate dateWithDateString:str byFormat:formateStr];
    NSLog(@"%@",date1);
     
      
    EncryptionManager *encryptionManager =[[EncryptionManager alloc]init];
    NSString *str11 =[encryptionManager encryptTextWithString:@"NSDate objects represent a single point in time. NSDate is a class cluster; its single public superclass, NSDate, declares the programmatic interface for specific and relative time values. The objects you create using NSDate are referred to as date objects. They are immutable objects. Because of the nature of class clusters, objects returned by the NSDate class are instances not of that abstract class but of one of its private subclasses. Although a date object’s class is private, its interface is public, as declared by the abstract superclass NSDate. Generally, you instantiate a suitable date object by invoking one of the date... class methods."];
    NSLog(@"%@",str11);
     
    
    
    
    NSString *str12= [encryptionManager decryptTextWithString:str11];
    NSLog(@"%@",str12);
    
    


EncryptionManager.h
@interface EncryptionManager : NSObject
//将指定的字符串做加密处理
- (NSString *)encryptTextWithString:(NSString *)string;
//解密密文字符串
- (NSString *)decryptTextWithString:(NSString *)string;
#import "EncryptionManager.h"
@interface EncryptionManager()
//私有加密方法
- (NSString *)_encodeString:(NSString *)string;
//私有解密方法
- (NSString *)_decodeString:(NSString *)string;
@end
@implementation EncryptionManager
- (NSString *)_encodeString:(NSString *)string{
    // 为了方便将来解密字符串,先将得到的字符string转成大写字符串
    NSString *newString = [string uppercaseString];
    NSInteger length = [string length];
    //先创建一个可变字符串对象
    NSMutableString *encodedStr = [[NSMutableString alloc]init];
    for (int i = 0 ; i < length; i++) {
        char currentChar = [newString characterAtIndex:i];
//        if (currentChar == ' ') {
//            [encodedStr appendFormat:@"%c",currentChar];
//
//        }else{
//            [encodedStr appendFormat:@"%d",currentChar];
//        }
        [encodedStr appendFormat:@"%d",currentChar];
            }
    return encodedStr;
}
- (NSString *)encryptTextWithString:(NSString *)string{
    return [self _encodeString:string];
}

- (NSString *)_decodeString:(NSString *)string{
    NSInteger length = [string length];
    NSMutableString *newString = [[NSMutableString alloc]init];
    for (int i = 0; i < length; i+=2) {
        NSRange range = NSMakeRange(i, 2);
        NSString *subString = [string substringWithRange:range];// 每循环一次得到两个数组组成的字符子串
        int ascii_number = [subString intValue];
        [newString appendFormat:@"%c",ascii_number];
    }
    
    //在返回最终的明文字符串之前将字符串转成首字母大写的。
    return [newString capitalizedString];
    
}
-  (NSString *)decryptTextWithString:(NSString *)string{
    return [self _decodeString:string];
}


 
@end
</span>

你可能感兴趣的:(设计模式,ios,解密,格式化,NSMutableArray)