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中声明了两 ...
随机推荐
- 使用ContentObserve监听用户发出的短信
import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.app.Activit ...
- CentOS hadoop启动错误 JAVA_HOME is not set and could not be found
... Starting namenodes on [] localhost: Error: JAVA_HOME is not set and could not be found. localhos ...
- HTTP(socket)下载遇到valgrind提示的错误: Conditional jump or move depends on uninitialised value(s)
我写了个http下载函数,下载txt.jpg都正常,就是下载php有问题:valgrind会报错Conditional jump or move depends on uninitialised va ...
- mysql.default_socket 和 mysqli.default_socket
php.ini 里面mysql.default_socket 和 mysqli.default_socket 设置必须要和mysql里面的值一样,否则连接mysql会提示错误
- not use jquery
document.getElementById('myElement');document.querySelector('#myElement'); document.getElementsByCla ...
- LightOJ 1141 Program E
Description In this problem, you are given an integer number s. You can transform any integer number ...
- linux下的powershell,pash试用手记
------1 概述------ 1.1 简单来说linux,unix是非常依赖脚本的,而win不是.win中有很多图形程序+c库,效率不比脚本差.点几下鼠标照样能完成需求.当 然,图形和字符是两码事 ...
- 速度!!!抢KIS英文版(多设备版)3年激活码
活动地址 http://promo.kaspersky.com/wvu直接打不开,需要用 US 的 在 线 代 理,暂时提供1个(204.12.228.235)可以绕过第一步邮箱验证注意:3年版多设备 ...
- 关押罪犯(noip2010)
解法: (1)搜索(30分) (2)二分(此题属于最大值最小问题) (3)贪心+并查集 下面着重说一下“贪心+并查集” 因为有A.B两座监狱,每个犯人不是在A,就是在B监狱. 至于每个犯人在那个监狱, ...
- hdu 2075
PS:水得不能再水..刚开始还以为是大数..要用到快速幂...谁知道想太多...就普通int型.. 代码: #include "stdio.h" int main(){ int a ...