iOS学习笔记---oc语言第七天
类的扩展
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语言第七天的更多相关文章
- iOS学习笔记---oc语言第一天
第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++ java ...
- iOS学习笔记---oc语言第五天
字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...
- iOS学习笔记---oc语言第四天
字符串 数组 一.使用苹果帮助文档 学会使⽤用苹果帮助⽂文档是开发者的⼀一项技能 Inherits from 继承⾃自 Conforms to 遵循什么协议 Framework 属于哪个框架 Avai ...
- iOS学习笔记---oc语言第三天
继承.初始化方法 一.继承 继承的上层:父类 继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量 ...
- iOS学习笔记---oc语言第九天
初级内存管理 iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现 内存问题体现在两个方面:内存溢出\野指针异常 内存溢出:程序运行超出内存上限 野指针异 ...
- iOS学习笔记---oc语言第六天
Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语⾔中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函 ...
- iOS学习笔记---oc语言第二天
实例变量与方法 一.实例变量的可见度 二.方法 oc中的方法分两种:类方法和实例方法 类方法:只能类使用 eg:+ (id)alloc 注:类方法中不能使用实例变量 实例方法:只能对象使用,eg:- ...
- iOS学习笔记---oc语言第十天
内存管理高级 一 属性的内部实现原理 assign retain copy assign 下的属性内部实现 setter方法 @property(nonatomic,assign)NSS ...
- iOS学习笔记---oc语言第八天
属性 能在一定程度上简化代码,并且增强实例变量的访问安全性 属性的声明:使用@property声明属性 eg:@property NSSstring *name;相当于@interface中声明了两 ...
随机推荐
- Redis persistence demystified - part 2
重写AOF 当AOF文件太大时,Redis将在临时文件重新写入新的内容.重写不会读取旧的AOF文件,而是直接访问内存中数据,以便让新产生的AOF文件最小,重写过程不需要读取磁盘. 重写完成后,Redi ...
- sql类型转换
CAST 和 CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.CAST 和 CONVERT 提供相似的功能. 语法 使用 CAST: CAST ( expression AS data ...
- js里面引入js
document.write('<script src="http://js.xcar.com.cn/bbs/sidebar/js/publicSidebar.js"> ...
- django.test.client 使用随记
import os,sys,django; sys.path.append("\\path\\to\\mysite")#ATTETION!,Err: "unable to ...
- hdu 4631 Sad Love Story
http://acm.hdu.edu.cn/showproblem.php?pid=4631 没想到这道题需要用“平均时间复杂度” 计算 一直没有想到解法 因为不符考虑了最坏情况的理念 方法一: ...
- PowerMock遇到的问题——3
在用WhiteBox调用对象的私有方法时,如果要传的参数为空,如果直接在参数列表中写null的话,可能会报空指针异常,可以定义一个变量使他等于空,再把变量传进去就可以了.
- Unity截屏
方式一:直接使用unity自带的截图函数 Application.CaptureScreenshot(“imagename”); 保存路径: 在PC上保存路径为Application.dataPath ...
- Windows Server 2012 R2 设置
一.任务栏左下角启动服务器管理器,然后进行设置.1.登录不显示服务器管理器 2.本地服务器,看到右边的IE增强的安全配置,如图所示,关闭两项内容.这样就关闭了IE增强安全提示框. 3.“工具”菜单,启 ...
- 使用GoldenGate进行平台迁移和数据库升级(9i->11g)步骤描述
在一个场景中,需要从Solaris SPARC将数据库迁移到Linux X86-64,同时,数据库版本从原有的oracle 9i(9.2.0.5)升级到11g(11.2.0.4)使用OGG的数据同步功 ...
- mybatis多对一关联的两种方式
第一个种是Address找到自己的user_id,扔给User,让User自己去再查一次,即使在有缓存的前提下,每遇到一个新的user_id,就会查一次,对比hibernate的话,相当于多对一eag ...