您的位置:首页 > 编程语言 > Go语言

随意细解:OC -- NSData、Category、Extension、Protocol

2015-11-04 21:44 537 查看

系统中表示时间日期的类—-NSDate

NSDate打印时,描述方法默认打印0时区,所以时差为8小时

初始化方法:

初始化一个现在的时间

NSDate *date = [NSDate date];


初始化一个时间,为距离现在 n 秒之后的时间日期 (n = 3600 * 24)

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600 * 24];


例如:昨天

NSDate date = [NSDate dateWithTimeIntervalSinceNow: - 3600 24];

初始化一个时间,为距离2001-1-1 00:00:00 n秒之后的时间 (n = 3600 )

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:3600];


初始化一个时间,为距离1970-1-1 00:00:00 n秒之后的时间 (n = 3600)

NSDate *date = [NSDate dateWithTimeIntervalSince1970:3600];


把 NSDate 转化为 NSString 格式输出:

步骤1.初始化一个日期

NSDate *D = [NSDate date];


初始化一个日期格式对象

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];


添加一个格式

[formatter setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];


新建一个NSTimeZone,设置时区差为 0 (设置后不会有8小时的差)

NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];


在格式中设置NSTimeZone

[formatter setTimeZone:zone];


新建字符串,接收Date转换后的结果,并输出

NSString *str = [formatter stringFromDate:D];
NSLog(@"%@",str);


把 NSDate 转化为 NSString 格式输出:

初始化一个时间的字符串

NSString *str = @"2014年05月01日 10点23分18秒";


步骤2-5.同上

新建 NSDate 接收NSString转换后的Date,并输出

NSDate *D = [formatter dateFromString:str];
NSLog(@"%@",D);


类目—- Category

特点:可以给看不到实现的系统类添加方法,并且添加的方法。使用系统类的对象或者类名直接可以调用。 切记:只能添加方法,不能添加实例变量。类目中添加的方法,相当于直接添加到系统类中,是可以被继承的。

例:给 NSDate 类添加 dataWithDateString 方法,将字符串转化为 NSDate 格式

新建一个Objective-C File ,File Type 选为Category ,Class的选择系统已有的类,这里举例为:NSDate 。

在 .h 文件中声明类方法:

(NSDate *)dataWithDateString:(NSString *)str;


在 .m 文件中写方法的实现:

 (NSDate *)dataWithDateString:(NSString *)str
{
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];
[formatter setTimeZone:zone];NSDate *date = [formatter dateFromString:str];
return date;
}


在 main.m 文件中调用:(记得导入头文件)

NSString *string = @"20140402142850";
NSLog(@"%@",[NSDate dataWithDateString:string]);


延展—- Extension

方法一:

1.在 .m 文件的中写 @interface 类名 ()
@interface 类名 ()


2.在 @interface 和 @end 之间声明方法

@interface 类名 ()
- (void)sayHi;

@end


3.在 @implementation 和 @end 之间写私有方法的实现

@implementation 类名

- (void)sayHi
{
NSLog(@"sayHi");
}

@end


方法二:

延展中可以写实例变量和方法,并且是私有的实例变量和方法申明。

特点:一定要给有源代码的类创建延展,要不然毫无意义。并且声明的私有方法,需要去原类的.m文件中实现

1.新建一个Objective-C File ,File Type 选为Extension ,Class的选择自己定义的类。在 .h 文件中声明方法。

@interface 类名 ()
- (void)sayHi;

@end


2.在类中导入头文件,在 .m 文件中写私有方法的实现

@implementation 类名

- (void)sayHi
{
NSLog(@"sayHi");
}

@end


代理—- Protocol

使用协议代理的步骤:

先创建协议

新建一个Objective-C File ,File Type 选为Protocol 。例子为:MarryProtocol

协议中 @required 为必须要实现的方法(也是默认的)。@optional 为可选择的实现。

@required   // 必须要实现的(也是默认的)
- (void)makeMoney;

@optional    // 可选择实现的
- (void)makeCook;


遵守协议

在代理的类 .h 文件中:导入Protocol协议的头文件。例子为 Boy类

在@interface 类名 :NSObject

@interface Boy : NSObject <MarryProtocol>  // 遵守协议


实现协议中方法

在 Boy.m 文件中写协议中必须要写的方法

// 实现协议中的方法
- (void)makeMoney
{
NSLog(@"我去挣钱");
}

- (void)makeCook
{
NSLog(@"好,我去做饭了");
}


添加代理对象为实例变量 (谁需要代理 就在那个类里声明实例变量)

在 Girl.h 文件中,导入协议的有文件

#import "MarryProtocol.h"


将代理对象作为实例变量。代理对象必须是遵守协议的对象

@interface Girl : NSObject
{
id<MarryProtocol> _delegate;
}


添加设置代理对象的方法(set方法)

在 Girl.h 文件中声明set方法:

- (void)setDelegate:(id<MarryProtocol>)delegate;


在 Girl.m 文件中实现set方法:

// 添加设置代理的方法set
- (void)setDelegate:(id<MarryProtocol>)delegate
{
_delegate = delegate;
}


让代理去干活(让代理去调用协议中的方法)

在 Girl.m 文件的实现方法中调用代理

- (void)hungry
{

NSLog(@"我是女的,肚子饿了");

// 需要 你给她做饭
// 需要 代理去做饭
// 需要 代理去调用做饭的方法
// 需要 代理的对象去调用协议中的方法(因为代理对象实现了代理的方法)

// 让代理去调用协议中的方法
// 判断一下 代理有没有实现这个方法
// respondsToSelector 方法 判断这个类中有没有实现某个方法 返回一个BOOL值
// 让代理去调用方法的一个安全保护
if ([_delegate respondsToSelector:@selector(makeCook)]) {
[_delegate makeCook];
}
}


从main函数创建对象 设置代理对象

在 main.m 中调用。首先导入 Boy.h 和 Girl.h ,创建 Boy 、Girl 对象,设置代理

Boy *b = [[Boy alloc]init];

Girl *g = [[Girl alloc]init];

// 设置代理
[g setDelegate:b];

[g hungry];


运行结果:

2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 我是女的,肚子饿了
2015-11-03 20:59:52.094 LessonOCDay_7_Protocol[3068:277183] 好,我去做饭了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: