一.OC概述
1. Objective-C概述
- Objective-C简称OC,扩充⾃C语⾔的⾯向对象编程语⾔。
- 是OS X和iOS操作系统的主要编程语⾔。
- C语⾔的超集,允许在OC中使⽤C语⾔源代码,编译器兼容C语⾔ 程序。
- 具备完善的⾯向对象特性。
- 包含⼀个运⾏时系统。
- 类库丰富。
2. 面向对象编程
- 分析涉及到的对象
- 根据功能定义类
- 使⽤对象的功能完成程序
3. 类和对象
- 类和对象是⾯向对象的核⼼。
- 类:具有相同特征和⾏为的事物的抽象。
- 定义类,创建对象,使⽤对象。
- 对象是类的实例。 类是对象的类型。
4.实例变量操作
- 实例变量在初始化只做少量设置,后期还需要进⾏设置。
- 实例变量区分可⻅度,共三种。
- 这节课使⽤public @public:实例变量访问修饰符号(公有)。
①.类:具有相同特征和行为的事物的抽象
描述一个类可以分成两部分:
- 特征(实例变量)
- 行为(方法)
②对象:类的实例化表现,可以找到对应的一个实际的事物。
根据类创建对象,创建好的每个对象都拥有类的所有特征和行为(实例变量和方法)
③我们以后的编码步骤
- 创建类,对类进行表述;
- 创建对象;
- 操作对象(实例变量和方法)
④@interface...@end 之间是类的接口部分
Person 类的名字
:后面是该类的父类的名字,表明该类继承于谁。
⑤NSObject是所有类的基类,即所有的类都直接或者间接继承于NSObject;
⑥以后所有的类的特征和行为的描述都要写在@interface与@end之间。
⑦@public关键字 实例变量的可见度。
⑧'-'方法是给对象发送消息 ,'+'方法是给类发送消息
⑨类与文件没有本质上的联系,文件是类的载体,但文件不是类。类的名字可以和文件的名字不相同,一个文件里可以写多个类。
⑩instancetype和id 都表示任意类型 ,区别instancetype只能做返回值类型;id既可以做返回值类型,又可以做参数的数据类型。
⑪只要是对象类型(非基本类型,如:int,long,short,bool等等)都可以用’%@‘输出。
⑫ return self;//self谁用谁知道,谁用该方法就指谁
⑬创建对象步骤:
- 类名 *对象名 =[ [类名 alloc ] init ];
- 赋值:对象名 -> _特征名=@“...”;
- 输出:NSLog( @“ %@ “,对象名->实例变量 );
- 消息发送机制:[ 对象名 方法名(接口) ];
总结:⾯向对象和⾯向过程是两种不同的编程思想,思考⾓度不同,前者以 对象为中⼼,后者以事件为中⼼。 类是对象的抽象,对象是类的体现。⾯向对象编程中,先创建出对应 的类,再由类⽣成对象,进⽽完成我们的开发。 类包含接⼝和实现两个部分,对象创建分两步:创建对象、初始化。 public修饰的实例变量,可以直接使⽤“—>”访问
_________________________________________________________________________
二.OC面向对象
1. 继承
一个子类只有一个父类,但一个父类可以被多个子类继承。
没有一个类的继承性是固定的,其被定义为父类还是子类取决于跟什么类去对比(NSObiect除外,其是基类,无法做子类)。
OC里没有多继承,子类可以继承父类的所有实例变量和方法。
2.初始化方法
-(instancetype)initWith…:(参数类型)参数 …:(参数类型)参数 ;
self = [super init]
在自身的初始化方法中,优先向super发送init消息,初始化实例变量,初始化成功后,再初始化自身特有量,从而完成全部实例变量的初始化。
在给本类的实例变量赋值之前,先调用父类的”实现“去初始化父类的实例变量。
做安全判断,如果父类初始化失败,则没有必要再给我本类的实例变量赋值。
super 编译器指令,不是对象 作用:调用父类的方法的实现。
3. 便利构造器
+(id)类名With…:(参数类型)参数 …:(参数类型)参数
{
return [[类名 alloc] initWith….];
}
便利构造器:封装类对象的创建过程,使用起来比较方便
‘+’方法,类名开头,返回值为该类的实例
_________________________________________________________________________
三.OC基本类型与数据结构
1.NSString
NSString 不可变字符串
1.创建字符串
(1)初始化方法
NSString @"hello"; NSString @"11111"; NSString *str = [[NSString alloc]initWithFormat:@"%@-word%@"] NSLog(@"%@“,str);
(2)便利构造器方法
NSString *str1 = [NSString stringWithFormat:@"%@11111111%@",Str,Str1]; NSLog(@"%@",str1);
2.字符串长度
NSUInteger length = [str1 length]; NSLog(@"%lu",length);
3.将C语言的字符串转换为OC的字符串对象。
char cStr[] = "iPhone"; NSString *ocStr = [NSString stringWithUTF8String:cStr]; NSLog(@"%@",ocStr);
4.判断该字符串是否以XX开头或者以XX结尾
NSString *address = @"www.baidu.com"; BOOL isSuccess = [address hasPrefix:@"www"]; NSLog(@"%d",isSuccess); BOOL isTrue = [address hasSuffix:@"om"]; NSLog(@"%d",isTrue);
5.获取字符串范围
NSRange 结构体
location :字符串所在的位置
length:字符串的长度
NSStringFromRange 将NSRange结构体变量转换成对象,直接用%@输出。
NSRange range = [address rangeOfString:@"bai"]; NSLog(@"%lu %lu",range.location,range.length); NSLog(@"%@",NSStringFromRange(range));
6.字符串截取
substringFromIndex 得到的字串包含所给的下标对应的字符。
NSString *result = [address substringFromIndex:1]; NSLog(@"%@",result);
substringToIndex 得到的字串不包含所给的下标对应的字符。
NSString *result1 = [address substringToIndex:5]; NSLog(@"%@",result1); NSString *result2 = [address substringWithRange:NSMakeRange(2, 4)]; NSLog(@"%@",result2);
7.字符串字母大小转换
(1).全部转大写
NSString *upStr = [address uppercaseString]; NSLog(@"%@",upStr);
(2).全部转小写
NSString *lowStr = [upStr lowercaseString]; NSLog(@"%@",lowStr);
(3).单词首字母大写
NSString *headStr = [address capitalizedString]; NSLog(@"%@",headStr);
8.字符串拼接
NSString *string = [NSString stringWithFormat:@"shanghai"]; NSString *appendStr = [string stringByAppendingString:@"lanou"]; NSLog(@"%@",appendStr);
9.字符串替换
stringByReplaceOccurrencesOfString:withString:首先再给定的字符串中查找方法中的第一个参数里的字符串,如果找到,将其替换成第二个参数给定的字符串,找到多个,全部替换,找不到,不进行替换。
NSString *beforeStr = [NSString stringWithFormat:@"shanghailanou0711"]; NSString *afterStr = [beforeStr stringByReplacingOccurrencesOfString:@"a" withString:@"*"]; NSLog(@"%@",afterStr);
10.字符串比较
NSString *compareStr1 = [NSString stringWithFormat:@"aaa"]; NSString *compareStr2 = [NSString stringWithFormat:@"aaa"]; BOOL isEqual = [compareStr1 isEqualToString:compareStr2]; NSLog(@"%d",isEqual);
NSMutableString 可变字符串,可以修改其本身;
1.创建NSMutableString
(1).初始化方法
NSMutableString *mStr=[[NSMutableString alloc]initWithFormat:@"SHS150711"]; NSLog(@"%@",mStr);
(2).便利构造器
NSMutableString *mStr1 = [NSMutableString stringWithFormat:@"SHS150711"]; NSLog(@"%@",mStr1);
2.插入字符串
[mStr insertString:@"牛B" atIndex:9]; NSLog(@"%@",mStr);
3.删除字符
[mStr deleteCharactersInRange:NSMakeRange(9, 2)]; NSLog(@"%@",mStr);
4.拼接字符串
[mStr appendFormat:@"wwww%@",mStr]; NSLog(@"%@",mStr); char str[] = {0}; printf("请输入图片后缀名:\n"); scanf("%s",str); NSMutableString *str1 = [NSMutableString stringWithUTF8String:str]; if ([str1 hasSuffix:@".png"]) { [str1 replaceCharactersInRange:NSMakeRange([str1 length] - 3, 3) withString:@"jpg"]; } else{ [str1 appendString:@".jpg"]; } NSLog(@"%@",str1);
2.NSArray
NSArry 数组对象 属于集合 不可变数组,当NSArray一旦被创建,就不可被改变。
数组是一个有序的集合,里面只能存放对象。
1.创建一个数组
(1).初始化方式
NSArray *arr=[[NSArray alloc]initWithObjects:@"aaaa",@"bbbb",@"cccc",@"dddd",@"eeee",nil]; NSLog(@"%@",arr[0]);
(2).便利构造器
NSArray *arr1 = [NSArray arrayWithObjects:@"aaaa",@"bbbb",@"cccc",@"dddd",@"eeee", nil]; NSLog(@"%@",arr1[1]);
2.数组的元素个数
NSLog(@"%lu",[arr count]);
3.获取数组中的某个元素(通过下标) 注意:OC中数组越界立即崩溃~在编码过程中不要使数组越界。
indexOfObject 给一个对象返回对象在数组中的位置,如果数组中没有该对象,返回垃圾值
id ss = [arr objectAtIndex:4]; NSUInteger a = [arr indexOfObject:@"aaaa"]; id asd = [arr firstObject]; NSLog(@"%@",ss); NSLog(@"%lu",a); NSLog(@"%@",arr);
================================================================================
NSMutableArray 可变数组 会根据数组里元素的增减自动的扩大或者缩小所占的空间。比较灵活,我以后使用较多的是可变数组。
1.创建可变数组
(1).初始化方法
NSMutableArray *mArr1 = [[NSMutableArray alloc]initWithCapacity:0];
(2).便利构造器
NSMutableArray *mArr2 = [NSMutableArray arrayWithCapacity:0];
2.向可变数组添加对象
removeAllObjects 删除数组中所有元素
[mArr1 removeAllObjects];
删除数组中最后一个元素
[mArr1 removeLastObject];
添加元素
[mArr1 addObject:@"aaa"]; [mArr1 addObject:@"aaa"]; [mArr1 addObjectsFromArray:aii];
按下标删除 对应下标下的元素
[mArr1 removeObjectAtIndex:0];
插入数组的数组(根据需求来选择插入或者添加);
[mArr1 insertObject:@"bbbn" atIndex:2];
交换数组内两个元素的位置。
[mArr1 exchangeObjectAtIndex:0 withObjectAtIndex:1]; NSLog(@"%@",mArr1);
替换字符串
[mArr1 replaceObjectAtIndex:[mArr1 count]-1 withObject:@"10010"]; NSLog(@"%@",mArr1);
判断数组中是否包含某个元素
[mArr1 containsObject:@"aaa"];
输出数组中的元素:
for (long i = 0; i < [mArr1 count]; i++) { NSLog(@"%@",mArr1[i]); NSLog(@"%@",[mArr1 objectAtIndex:i]); }
3.NSNumber
NSNumber 数值对象,完成数值标量与对象类型的转换。
int a = 10;
将int类型转换成对象。
NSNumber *objInt = [NSNumber numberWithInt:a]; NSLog(@"%@",objInt);
将NSNumber对象转回来
int b = [objInt intValue]; NSLog(@"%d",b);
NSValue
将自定义的结构体转化成NSValue对象。
valueWithBytes:参数1 objCType:参数2
参数1:获取要转化成对象的结构体变量的地址。
参数2:按照对应的结构体类型进行对象的转化。
Stu stu1 = {"asd",'m'}; Stu stu2 = {"asd",'f'}; NSValue *objStrutOrPoint = [NSValue valueWithBytes:&stu1 objCType:@encode(Stu)]; NSLog(@"%@",objStrutOrPoint);
把Value对象转换回自定义结构体变量
Stu stu; [objStrutOrPoint getValue:&stu]; NSLog(@"%s %c",stu.name,stu.sex);
4.字典
字典 存放键值对(key --value)的集合,字典中的每一个元素都是键值对
字典是无序的集合,字典中key不能重复
字典可分: 不可变(NSDictionary)和可变(NSMutableDictionary)
1.NSDictionary
(1).初始化方法
在赋值时,先写值,后紧跟键。
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"zhangsan",@"name",@"20",@"age", nil]; NSLog(@"%@",dic);
(2).便利构造器
在初始化字典时,如果出现多个相同的key,系统只会识别第一个,不会理会后面剩余的对象。
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"rain",@"weather",@"bid",@"wind", nil]; NSLog(@"%@",dic1);
2.获取字典中所有的key
NSArray *keys = [dic1 allKeys]; NSLog(@"%@",keys);
3.获取字典中所有的Value;
NSArray *values = [dic1 allValues]; NSLog(@"%@",values);
4.获取字典中所有相同value的key;
NSArray *arr=[dic allKeysForObject:@"20"]; NSLog(@"%@",arr);
5.根据key获取value
NSArray *arr1 = [dic1 valueForKey:@"weather"]; NSLog(@"%@",arr1);
6.字典比较
BOOL ss = [dic isEqualToDictionary:dic1]; NSLog(@"%d",ss);
-----------------------------------------------------------------------------------------------------------------------------
NSMutableDictionary 可变字典 可以添加,删除,修改键值对
1.创建可变字典
(1).初始化方法
NSMutableDictionary * mdic = [[NSMutableDictionary alloc]initWithCapacity:0];
(2).便利构造器
NSMutableDictionary * mdic1 = [NSMutableDictionary dictionaryWithCapacity:0];
2.添加键值对
NSLog(@"%@",mdic); [mdic setObject:@"rain" forKey:@"weather"]; NSArray *arr = @[@"111",@"222",@"333"]; [mdic setObject:arr forKey:@"arr"]; NSDictionary *ddic = [NSDictionary dictionaryWithObjectsAndKeys:@"rain",@"weather",@"big",@"wind", nil]; [mdic setObject:ddic forKey:@"ddic"]; NSLog(@"%@",mdic); NSArray *arrs = [mdic objectForKey:@"arr"]; NSLog(@"%@",arrs[1]);
3.删除键值对
(1).根据对应的key删除对象
[mdic removeObjectForKey:@"weather"]; NSArray *keyArr = @[@"weather",@"arr"];
(2).根据传入的数组中的对个key删除多个对象;
[mdic removeObjectsForKeys:keyArr]; NSLog(@"%@",mdic);
4.修改键对应的值
[mdic setObject:@"noRain" forKey:@"weather"];
如果可变字典添加相同key值的键值对,后一个会覆盖掉前一个的值,最终只会保留最后一个键值对
5.集
NSSet 集合类 不可变 在创建后不可修改集合中的对象,也不可增加,减少集合中的对象的个数。集合是无序的,集合里不允许出现相同的元素。
1.创建集合
(1).初始化方法
NSSet *set = [[NSSet alloc]initWithObjects:@"asd",@"hds",@"gfdg",@"vfds", nil]; NSLog(@"%@",set);
(2).便利构造器
NSSet *set1 = [NSSet setWithObjects:@"aq",@"ee",@"cf",@"ysad", nil]; NSLog(@"%@",set1);
2.集合中元素的个数
NSLog(@"%ld",[set count]);
问题:快速去除数组中相同的元素
答案:把数组放入集合中快速去除数组中多余的元素。
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3",@"3",@"4", nil]; NSSet *set2 = [NSSet setWithArray:arr]; NSLog(@"%@",set2); NSArray *arr1 = [set2 allObjects]; NSLog(@"%@",arr1);
3.获取系统中的每个元素
NSLog(@"%@",[set anyObject]);
NSLog(@"%@",[set anyObject]);
NSLog(@"%@",[set anyObject]);
NSLog(@"%@",[set anyObject]);
NSLog(@"%@",[set anyObject]);
4.判断集合中是否包含某个对象
BOOL isContain = [set1 containsObject:@"aq"];
NSLog(@"%d",isContain);
NSMutableSet 可变集合
1.创建一个可变集合
(1).初始化方法
NSMutableSet *sett1 = [[NSMutableSet alloc]initWithCapacity:0];
(2).便利构造器
NSMutableSet *sett2 = [NSMutableSet setWithCapacity:0];
2.添加元素
[sett1 addObject:@"aaa"]; NSArray *mSetarr = [NSArray arrayWithObjects:@"bbb",@"ccc",@"ddd",@"eee", nil];
集合中添加一个数组,是把该数组中的元素添加进集合中。
[sett1 addObjectsFromArray:mSetarr]; [sett1 removeObject:@"ccc"]; [sett1 removeAllObjects]; NSLog(@"%@",sett1);
3.NSCountedSet 计数集合,用来统计集合中元素重复的个数
NSCountedSet *countSet = [NSCountedSet setWithObjects:@"1",@"2",@"2",@"3",@"1",@"5", nil];
NSLog(@"%@",countSet);
返回给定元素在集合中重复的次数
NSLog(@"%lu",[countSet countForObject:@"1"]);
4.数组排序
快速枚举 遍历集合中的对象
NSArray *arr = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g", nil]; for (id str in arr) { NSLog(@"%@",str); } NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"20",@"age",@"m",@"sex", nil]; //遍历出来的ss是key for (id ss in dic) { NSLog(@"%@",[dic objectForKey:ss]); } NSSet *set = [NSSet setWithObjects:dic, nil]; for (id str1 in set) { NSLog(@"%@",str1); }
使用for...in遍历数组的时候不可以删除,添加(不可以改变数组的容量大小)。
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"5",@"4",@"7",@"2",@"15",@"1", nil]; [arr sortUsingSelector:@selector(compare:)]; NSLog(@"%@",arr); for (int i = 0; i < [arr count] -1; i++) { for (int j = 0; j < [arr count]- i - 1; j++) { if ([[arr objectAtIndex:j]intValue]>[[arr objectAtIndex:j+1]intValue]) { [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } } } NSArray *arr1 = [NSArray arrayWithObjects:@"5",@"4",@"7",@"2",@"15",@"1", nil]; NSArray *sortedArr = [arr1 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",sortedArr); NSLog(@"%ld %ld %ld",NSOrderedDescending,NSOrderedSame,NSOrderedAscending);
6.Block
函数指针变量里存的是函数名,即函数的首地址。
block变量里存放的是整个函数的实现体。
//该block的类型是:int (^)(int int)
//myblock是该block的名字。
/*
^ (int a,int b ){
return a+b;
};
是给myblock赋的初值。
*/
int (^myblock)(int , int) = ^ (int a,int b ){
return a+b;
};
int result = myblock(10,20);//block是变量,不是指针!!!不可以重指向,只可以重新赋值。
NSLog(@"%d",result);
==================================
void (^block1)() = ^(){
NSLog(@"hello");
};
block1();
NSString *(^block2)(int ) = ^ (int string){
return [NSString stringWithFormat:@"%d",string];
};
NSString * str = block2(100);
NSLog(@"%@",str);
//用typedef关键字,给int (^)(int,int)类型重新起一个新名字,方便以后定义。
typedef int (^newBlock)(int,int);
newBlock myBlock = ^(int a , int b ){
return a+b;
};
//在block的实现体内部不允许修改局部变量的值。如果想要修改,将该局部变量用__block关键字修饰。
__block int num = 1;
typedef void (^newblock)();
newBlock block = ^(){
int result = ++num * 10;
NSLog(@"%d",result);
};
block();
7.NSDate
获取当前的时间点.
NSDate *current = [NSDate date];
//NSLog输出的是零时区的时间
NSLog(@"%@",current);
NSDate *tomorrowDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
//传入一个秒数,返回当前时间加上给定的秒数之后的时间.
NSLog(@"%@",tomorrowDate);
//根据给定的时间点加上对应的秒数返回一个新的时间.
NSDate *dates = [NSDate dateWithTimeInterval:24*60*60 sinceDate:tomorrowDate];
NSLog(@"%@",dates);
//根据传入的秒数,返回2001年1月1号0时0分加上对应的秒数得到的时间
NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:24*60*60];
NSLog(@"%@",date);
//根据传入的秒数,返回1970年1月1号0时0分加上对应的秒数得到的时间
NSDate *datess = [NSDate dateWithTimeIntervalSince1970:60];
NSLog(@"%@",datess);
NSDate *currentDate =[NSDate date];
NSLog(@"%f",[currentDate timeIntervalSince1970]);
//返回2001年1月1日到当前时间的秒数.
NSTimeInterval times = [NSDate timeIntervalSinceReferenceDate];
NSLog(@"%f",times);
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:- 60 * 60 * 24];
NSLog(@"%f",[yesterday timeIntervalSinceReferenceDate]);
//timeIntervalSinceDate 返回给定时间与receive时间点之间的秒数.
NSDate *yes = [NSDate dateWithTimeIntervalSinceNow:- 24 * 60* 60];
NSDate *tom = [NSDate dateWithTimeIntervalSinceNow:24 * 60 * 60];
NSTimeInterval ti = [tom timeIntervalSinceDate:yes];
NSLog(@"%f",ti);
//=================
计算当前时间和⼀个固定时间的差值,如果差值在60秒内,输出“刚 刚”,如果在60秒外3600秒内,输出“xx分钟前”,如果3600秒外, 3600*24秒内,输出“xx⼩时前” 。
NSDate *current = [NSDate date];
NSDate *dates = [NSDate dateWithTimeInterval:arc4random()%3600*24 sinceDate:current];
NSTimeInterval times = [dates timeIntervalSinceDate:current];
if (times < 60) {
NSLog(@"刚刚");
}
else if (times >=60 && times < 3600){
NSLog(@"%.2f分钟之前",times/60);
}
else{
NSLog(@"%.2f小时之前",times/3600);
}
NSDateFormatter
NSDateFormatter 日期格式类,根据设定的格式转化时间(字符串与时间之间的转化).
NSDateFormatter *formatter = [[NSDateFormatter alloc ]init];
1.创建日期格式类对象
2.设置日期格式
/*
y 年份
M 月份
d 天
h 24小时制的小时
m 分钟
s 秒
*/
[formatter setDateFormat:@"yyyy年MM月dd日 hh时mm分ss秒"];
3.将字符串转化为日期对象(将日期对象转化为字符串);
NSString *dateString = [formatter stringFromDate:[NSDate date]];
NSLog(@"%@",dateString);
NSString *dateStr = @"2015年08月24日 11时56分40秒";
NSDate *date = [formatter dateFromString:dateStr];
NSLog(@"%@",date);
8.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与⼦类的区别分类(类目)只能添加方法,不能添加实力变量.
9.Extension
(1).Extension的主要作⽤是管理类的“私有”⽅法。
(2).⾯向对象编程也叫⾯向接⼝编程。
(3).在设计⼀个类的时候,有些⽅法需要对外公开(我们称为接⼝), 有些⽅法仅仅内部使⽤(⽐如:是某个⽅法的⼀个⼩步骤)。
(4).Extension的功能是帮我们去管理这些内部使⽤的⽅法(“私有”⽅ 法)。
定义Extension
- Extension的语法格式和Category很相似
- 相当于把Category的.h⽂件挪到了原始类的.m⽂件中
- Extension针对的是⾃⼰的类,必须有源代码的类
xxx.m⽂件
@interface xxx (ExtensionName) //你的⽅法列表 @end @implementation xxx //⽅法的实现 @end
Category和Extension的区别
10.Protocol
- Protocol(协议),是iOS开发中常⽤的技术。
- 协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。就像⼀张任 务清单(或便利贴),上⾯写了⼀堆需要处理的事。清单交给谁, 谁就要去完成清单上规定的任务。
- 接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就 要去完成清单上规定的任务。
定义Protocol
@protocol开始,以@end结束,例如://默认不写或者有@required是必须要实现的协议方法
@protocol MarryProtocol
- (void)makeMoney;
@optional //可选的协议方法
- (void)washcloth;
- (void)cook;
@end
遵守协议
遵守协议分两步
- 在类的.h⽂件 ⽗类名后写上<协议名>。
- 在.m⽂件中实现协议中的⽅法。
相当于给这个类添加了若干个⽅法。这个类的实例就可以调⽤这 些⽅法。
11.delegete
Protocol的核⼼使⽤场景是实现delegate设计模式。
delegate(代理)。通俗的讲就是代理商,主要的任务是帮你完 成⼀些任务。
⽐如:保姆就可以认为是delegate,主要的任务是帮你带孩⼦、 做饭、洗⾐服等。
使⽤场景:
凡是某些任务⾃⼰不去实现,想让别⼈去实现的时候, 就可以指定⼀个代理,让代理帮你去做。你只需要通知代理去做某 某事。
12.总结:
- NSDate是iOS中表示日期的类。可以使用NSDateFormatter控制 NSString和NSDate的互转
- Category能为没有源代码的类添加方法
- Extension为类管理私有方法
- Protocol和delegate通常联合使用,是iOS开发中特别常用。