类的扩展

NSDate是Cocoa中用于处理日期和时间的基础类,封装了某一给定的时刻,具体的日期 时间和时区

使用+date方法获取当前日期和时间

 NSDate *date = [NSDate date];//获取当前时间
NSLog(@"%@",date);//无论你是哪个时区的时间,打印的总是o时区的时间
NSDate *date2 = [NSDate dateWithTimeIntervalSinceNow:**];//从现在开始之后的时间
NSLog(@"%@",date2);
NSTimeInterval date3 = [date timeIntervalSince1970];//获取时间间隔 从1970年到现在的时间间隔
NSLog(@"%f",date3);

NSTimeInterval

即double类型,用以表示以秒为单位的时间间隔

可以使⽤用-initWithTimeIntervalSinceNow:⽅法传入一个NSTimeInterval参数,创建⼀个 NSDate对象

例如:NSDate * tomorrowDate = [[NSDate alloc] initWithTimeIntervalSinceNow:24*60 * 60];

NSDate * yesterdayDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-1 * 24*60 *60];

取两个时间对象的间隔:NSTimeinterval = [tomorrowDate timeIntervalSinceDate:yesterdayDate];

     NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
//YYYY代表4位的年
//MM代表两位的月
//dd代表两位的日
//HH代表24进制小时
//mm代表两位的分钟
//ss代表两位的秒
//NSDateFormatter功能是NSString 与 NSDate 互转
//1.NSDate转换为NSString
NSString *datestr = [format stringFromDate:date];
NSLog(@"%@",datestr); NSDate *newdate = [format dateFromString:@"2014-07-02 11:54:03"];
NSLog(@"%@",newdate);

Category

Category也叫分类或类⺫

主要作用是为 没有源代码 的类添加方法。

通过Category添加的⽅法会成为原类的一部分。从⽽而达到扩展一 个类的功能。

一般扩展系统或者第三方类库

定义Category

新建⽂件

选择Objective-C Category模板

填写类名和分类名

.h⽂件添加⽅法声明

.m添加方法实现

需要使⽤的地方进⾏行调用

Category的声明

NSString+SayHi.h⽂件

@interface NSString (SayHi)

- (void)hi;

@end

Category的实现

NSString+SayHi.m文件

#import “NSString+SayHi.h”

@implementation NSString(SayHi)

- (void)hi{

NSLog(@”这是通过category为NSString添加的hi方法”);
}

@end

Category与子类的区别

练习:

使⽤用Category为NSDate类添加⼀个类⽅方法

(dateWithDateString:),实现将下述字符串转换为NSDate对象。 将@“20140402142850”转换为NSDate。

NSLog(@"%@",[NSDate dateWithString:@"20140402142850"]);

NSDate+DateWithString.h中代码
#import <Foundation/Foundation.h> @interface NSDate (DateWithString)
+ (NSDate *)dateWithString:(NSString *)str;
@end
NSDate+DateWithString.m中代码
#import "NSDate+DateWithString.h" @implementation NSDate (DateWithString)
+ (NSDate *)dateWithString:(NSString *)str
{
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"YYYYMMddHHmmss"];
NSDate *date = [format dateFromString:str];
return date;
}
@end
main.m中代码
NSLog(@"%@",[NSDate dateWithString:@""]);

Extension

主要作用是为类添加"私有"方法

在.h中没有声明,在.m中有实现

有时候方法比较复杂的时候,使用私有方法结合组成一个复杂方法,,外部实现只用声明复杂方法,不用理会私有方法的实现

 #import "Person.h"
@interface Person()//这样就写成Extension,不写也可以,写出来只是为了管理,给程序看的,让其他开发者一眼能看出来那些是"私有"方法
{
NsInteger _age;//定义一个私有变量
} - (void)eat; @end

@implementation Person
- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex
{
self = [super init];
if (self) {
_name = name;
_sex = sex;
}
[self eat];
return self;
}
- (void)eat//只有实现,没有声明 .m文件中其他方法可以调用
{
NSLog(@"这是一个私有方法,只有自己的.m文件中使用eat");
}
@end

Protocol 协议

协议是一套标准(一堆方法的声明),只有.h文件

接受协议的对象实现协议中定义的方法

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>//< >中定义的的这个协议也遵守了NSObject协议
@required//默认是必须实现的 可以省略,省略代表必须实现
- (void)method1;
- (void)method2;
@optional//可选择是否实现
- (void)method3;
@end

遵循协议

#import “MarryProtocol”

@interface Boy : NSObject <MarryProtocl> ...

@end

@implementation Boy

//协议中⽅法的实现

@end

一个结婚的协议例子

//协议MarryProtocol.h中文件
#import <Foundation/Foundation.h> @protocol MarryProtocol <NSObject> - (void)washcloth; - (void)cook; - (void)dohousework; - (void)makeMoney; @optional
- (void)hitDouDou; @end
//Girl.h中代码
#import <Foundation/Foundation.h>
#import "MarryProtocol.h" @interface Girl : NSObject
{
NSInteger _age;//年龄
id <MarryProtocol> _husband; }
- (instancetype)initWithAge:(NSInteger)age;
//设置年龄
- (void)setAge:(NSInteger)age;
//获得年龄
- (NSInteger)age; - (void)work; - (void)setHusband:(id<MarryProtocol>)husband; - (void)hungry;
- (void)dirty;
@end
//Girl.m中代码
#import "Girl.h" @implementation Girl
- (instancetype)initWithAge:(NSInteger)age
{
self = [super init];
if (self) {
_age = age;
}
return self;
}
- (void)hungry
{
[_husband cook];
}
- (void)setAge:(NSInteger)age
{
_age = age;
} - (NSInteger)age
{
return _age;
} - (void)work
{
NSLog(@"接拍电影,广告,电视剧");
} - (void)setHusband:(id<MarryProtocol>)husband
{
_husband = husband;
}
- (void)dirty
{
[_husband washcloth];
}
@end
//Boy.h中代码
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"
@interface Boy : NSObject <MarryProtocol>
- (void)work;
@end
//Boy.m中代码
#import "Boy.h" @implementation Boy
- (void)work
{
NSLog(@"我是一个牛逼替身");
} - (void)washcloth
{
NSLog(@"洗衣服");
} - (void)cook
{
NSLog(@"做饭");
} - (void)dohousework
{
NSLog(@"做家务");
} - (void)makeMoney
{
NSLog(@"赚钱");
}
- (void)hitDouDou
{
NSLog(@"打豆豆");
}
@end
//main.m中代码
#import <Foundation/Foundation.h> #import "Girl.h"
#import "Boy.h" int main(int argc, const char * argv[])
{ Girl *liuyifei = [[Girl alloc] initWithAge:];
[liuyifei work];
//数年之后
Boy *wangwu = [[Boy alloc] init];
[wangwu work]; //慢慢熟悉
//...
//走到一起
//丈母娘
//不同意 [liuyifei setHusband:wangwu];
[liuyifei hungry];
[liuyifei dirty]; //n年之后,wangwu富有了
[liuyifei setHusband:nil]; return ;
}

iOS学习笔记---oc语言第七天的更多相关文章

  1. iOS学习笔记---oc语言第一天

    第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++  java   ...

  2. iOS学习笔记---oc语言第五天

    字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...

  3. iOS学习笔记---oc语言第四天

    字符串 数组 一.使用苹果帮助文档 学会使⽤用苹果帮助⽂文档是开发者的⼀一项技能 Inherits from 继承⾃自 Conforms to 遵循什么协议 Framework 属于哪个框架 Avai ...

  4. iOS学习笔记---oc语言第三天

    继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量 ...

  5. iOS学习笔记---oc语言第九天

    初级内存管理 iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现 内存问题体现在两个方面:内存溢出\野指针异常 内存溢出:程序运行超出内存上限 野指针异 ...

  6. iOS学习笔记---oc语言第六天

    Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语⾔中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函 ...

  7. iOS学习笔记---oc语言第二天

    实例变量与方法 一.实例变量的可见度 二.方法 oc中的方法分两种:类方法和实例方法 类方法:只能类使用 eg:+ (id)alloc  注:类方法中不能使用实例变量 实例方法:只能对象使用,eg:- ...

  8. iOS学习笔记---oc语言第十天

    内存管理高级 一 属性的内部实现原理   assign   retain    copy assign 下的属性内部实现 setter方法 @property(nonatomic,assign)NSS ...

  9. iOS学习笔记---oc语言第八天

    属性 能在一定程度上简化代码,并且增强实例变量的访问安全性 属性的声明:使用@property声明属性  eg:@property NSSstring *name;相当于@interface中声明了两 ...

随机推荐

  1. 小记:获取post和get请求。

    package com.lixu.httpget_post; import java.io.ByteArrayOutputStream; import java.io.IOException; imp ...

  2. jquery返回上一页面

    window.location.href=document.referrer;   返回然后刷新 window.history.back(-1);  返回不刷新

  3. bzoj 2456: mode

    #include<cstdio> #include<algorithm> using namespace std; int n,t,sum; int main() { scan ...

  4. EasyMock的原理及使用方法

    就不费劲转过来了https://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/这上面介绍的比较全.

  5. ios上传应用后,审核流程完成前(reveiw)修改了程序内容,如何上传替换

    其实挺简单,只需要更改下version和build版本 看图说话就可以.我的程序之前版的版本设置 修改bug之后的设置: 然后重新打包就好了,提示打包成功后,在itunesconnect查看发现 选中 ...

  6. MVC5 烂笔头

    HttpContent Controller:HttpContextBase View:HttpContext.Current View的搜寻顺序:本文件夹.本共享.根共享等 class=" ...

  7. Xcode如何查看内存中的数据

    在  debug 模式下如何在断点处,查看字符指针变量内存中的值,像vs2008的调试工具一样的内存查看器,现在只能查看第一个内存中的值可以在输出窗口采用gdb命令:x /nfu <addr&g ...

  8. lightoj1080 线段树

    //Accepted 6628 KB 520 ms //I a b 把a到b区间的二进制位去反,转化成a到b区间的数全部加1 //Q a 判断第a位的奇偶 #include <cstdio> ...

  9. HDU 3829 - Cat VS Dog (二分图最大独立集)

    题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动 ...

  10. 2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据

    一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: "]) { [self performSegueWithIdentifier:@" ...