类的扩展

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. memached 服务器lru算法

    1.LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条 ...

  2. 【vmware vcp 5.1】安装及配置及笔记散记

    ESXi的几个命令技巧: ------------------------------------------------- alt-f1: 进入console alt-f2: 返回DCUI alt- ...

  3. AudioManager音频管理器

    AudioManager音频管理器提供了如下几种常用方法来控制手机音频: 1.adjustStreamVolume(int StreamType,int direction,int flgs):调整手 ...

  4. Linux 中 10 个有用的命令行补全例子

    在 Linux 系统中,当你输入一个命令,再按两次 TAB 键,就会列出所有以你输入字符开头的可用命令.这并不新鲜,可能你已经知道了.这个功能被称作命令行补全bash completion.默认情况下 ...

  5. HTML内容整理

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. 常州培训 day5 解题报告

    第一题:(贪心) 题目大意:给出N*M的矩形,要用正方形将它铺满(正方形之间不能重叠),相邻的正方形颜色不能相同,颜色用ABCD表示.要求从上到下从左到右字典序最小. N,M<=100 解题过程 ...

  7. CodeIgniter 让控制器可以支持多级子目录的 Router 类库

    MY_Router.php 放到 system/application/libraries 目录下,就可以让 CI 的控制器支持多级子目录了.这样,你就可以在 system/application/c ...

  8. 在其他页面调用 Discuz 7.2 BBS 论坛会员登录信息

    require_once './bbs/include/common.inc.php'; $discuz_uid 是用户ID $_DSESSION是用户所有信息

  9. SQLite实现Top功能

    SQlite本身没有top功能,无法向TSQL一样下Select top 100 * from tb_table,但SQLite提供了一个Limit关键字用来取得相应行数的资料 具体语法实例:Sele ...

  10. 安装eclipse for c/c++环境

    安装eclipse for c/c++环境:       1.启动eclipse,       2.选择Help->Install New Software...,在Work with的框框下复 ...