OC语言之Protocol基本使用 拼搏现实的明天。 2022-08-20 10:09 258阅读 0赞 \# Protocol基本概念 \#\#1.protocol 基本概念 \- Protocol翻译过来, 叫做”协议” +在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的 +protocol它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的 \- Protocol的作用 +用来声明一些方法 +也就说, 一个Protocol是由一系列的方法声明组成的 \--- \#\#2.protocol 语法格式 \- Protocol的定义 \`\`\` @protocol 协议名称 // 方法声明列表 @end \`\`\` \- 类遵守协议 +一个类可以遵守1个或多个协议 +任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明 \`\`\` @interface 类名 : 父类 <协议名称1, 协议名称2,…> @end \`\`\` \- 示例 \`\`\` @protocol SportProtocol <NSObject> \- (void)playFootball; \- (void)playBasketball; @end \#import "SportProtocol.h" // 导入协议 @interface Studnet :NSObject<SportProtocol> // 遵守协议 @end @implementation Student // 实现协议方法 \- (void)playBasketball \{ NSLog(@"%s", \_\_func\_\_); \} // 实现协议方法 \- (void)playFootball \{ NSLog(@"%s", \_\_func\_\_); \} @end \`\`\` \#\#3.protocol和继承区别 \- 继承之后默认就有实现, 而protocol只有声明没有实现 \- 相同类型的类可以使用继承, 但是不同类型的类只能使用protocol \- protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可 \--- \# Protocol类型限制 \#\#1.protocol类型限制 \- 设定情景: +某攻城狮A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。 +满足条件的女生都可以向他发送消息 \- 从题目中我们得到要求 +会做饭 +会洗衣服 +有份好工作 \`\`\` @protocol WifeCondition<NSObject> \- (void)cooking; \- (void)washing; \- (void)job; @end \`\`\` \- 如何在代码中要求对象必须具备这些行为? +数据类型<协议名称> 变量名 \`\`\` // 如果没有遵守协议则会报警告 id<WifeCondition> wife = \[\[Personalloc\] init\]; \`\`\` \# 代理设计模式 \#\#1. \- 什么是设计模式 +设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 \- 什么是代理设计模式 +生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。 \- 代理设计模式的场合: +当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象) +对象B想监听对象A的一些行为(让对象B成为对象A的代理对象) +当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象) \--- \#\#2.代理设计模式示例 \- 婴儿吃饭睡觉 \`\`\` // 协议 \#import <Foundation/Foundation.h> @class Baby; @protocol BabyProtocol <NSObject> \- (void)feedWithBaby:(Baby \*)baby; \- (void)hypnosisWithBaby:(Baby \*)baby; @end \`\`\` \#import "BabyProtocol.h" @interface Baby : NSObject // 食量 @property (nonatomic, assign) int food; // 睡意 @property (nonatomic, assign) intdrowsiness; // 饿 \- (void)hungry; // 睡意 \- (void)sleepy; @property (nonatomic, strong)id<BabyProtocol> nanny; @end @implementation Baby \- (void)hungry \{ self.food -= 5; NSLog(@"婴儿饿了"); // 通知保姆 if (\[self.nanny respondsToSelector:@selector(feedWithBaby:)\]) \{ \[self.nanny feedWithBaby:self\]; \} \} \- (void)sleepy \{ self.drowsiness += 5; NSLog(@"婴儿困了"); // 通知保姆 if (\[self.nanny respondsToSelector:@selector(hypnosisWithBaby:)\]) \{ \[self.nanny hypnosisWithBaby:self\]; \} \} @end \`\`\` // 保姆 @interface Nanny : NSObject<BabyProtocol> @end @implementation Nanny \- (void)feedWithBaby:(Baby \*)baby \{ baby.food += 10; NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food); \} \- (void)hypnosisWithBaby:(Baby \*)baby \{ baby.drowsiness += 10; NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness); \} @end \`\`\` \- 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人 \--- \#\#3.代理设计模式练习 \- 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找 \# 代理设计模式 \#\#1. \- 什么是设计模式 +设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 \- 什么是代理设计模式 +生活中大家一定遇到这样的情况了:比如说我要买一包纸,不妨就是心相印的吧,那一般人的话我应该不是去心相印的工厂里面直接去买吧,而是我们在心相印专卖店或者什么超市啊,这些地方购买,这些地方实际上就是洁丽雅毛巾的代理。这其实和我们OO中的代理模式是很相似的。 \- 代理设计模式的场合: +当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象) +对象B想监听对象A的一些行为(让对象B成为对象A的代理对象) +当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象) \--- \#\#2.代理设计模式示例 \- 婴儿吃饭睡觉 \`\`\` // 协议 \#import <Foundation/Foundation.h> @class Baby; @protocol BabyProtocol <NSObject> \- (void)feedWithBaby:(Baby \*)baby; \- (void)hypnosisWithBaby:(Baby \*)baby; @end \`\`\` \#import "BabyProtocol.h" @interface Baby : NSObject // 食量 @property (nonatomic, assign) int food; // 睡意 @property (nonatomic, assign) intdrowsiness; // 饿 \- (void)hungry; // 睡意 \- (void)sleepy; @property (nonatomic, strong)id<BabyProtocol> nanny; @end @implementation Baby \- (void)hungry \{ self.food -= 5; NSLog(@"婴儿饿了"); // 通知保姆 if (\[self.nanny respondsToSelector:@selector(feedWithBaby:)\]) \{ \[self.nanny feedWithBaby:self\]; \} \} \- (void)sleepy \{ self.drowsiness += 5; NSLog(@"婴儿困了"); // 通知保姆 if (\[self.nanny respondsToSelector:@selector(hypnosisWithBaby:)\]) \{ \[self.nanny hypnosisWithBaby:self\]; \} \} @end \`\`\` // 保姆 @interface Nanny : NSObject<BabyProtocol> @end @implementation Nanny \- (void)feedWithBaby:(Baby \*)baby \{ baby.food += 10; NSLog(@"给婴儿喂奶, 现在的食量是%i", baby.food); \} \- (void)hypnosisWithBaby:(Baby \*)baby \{ baby.drowsiness += 10; NSLog(@"哄婴儿睡觉, 现在的睡意是%i", baby.drowsiness); \} @end \`\`\` \- 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人 \--- \#\#3.代理设计模式练习 \- 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找 \# 字符串读写 \#\#1.直接读写文件中的字符 \- 从文件中读取 \`\`\` // 用来保存错误信息 NSError \*error = nil; // 读取文件内容 NSString \*str = \[NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error\]; // 如果有错误信息 if (error) \{ NSLog(@"读取失败, 错误原因是:%@", \[error localizedDescription\]); \} else \{ // 如果没有错误信息 NSLog(@"读取成功, 文件内容是:\\n%@", str); \} \`\`\` \- 写入文件中 \`\`\` NSString \*str = @"江哥"; BOOL flag = \[strwriteToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil\]; if (flag == 1) \{ NSLog(@"写入成功"); \} \`\`\` \- 重复写入同一文件会覆盖掉上一次的内容 \`\`\` NSString \*str1 = @"江哥"; BOOL flag = \[str1writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil\]; NSString \*str2 = @"南哥"; \[str2writeToFile:@"/Users/LNJ/Desktop/lnj.txt" atomically:YESencoding:NSUTF8StringEncoding error:nil\]; NSString \*str = \[NSStringstringWithContentsOfFile:@"/Users/LNJ/Desktop/lnj.txt"encoding:NSUTF8StringEncoding error:&error\]; NSLog(@"str = %@", str); 输出结果:南哥 \--- \#\#2.NSURL简介 \- 什么是URL +URL的全称是Uniform Resource Locator(统一资源定位符) +URL是互联网上标准资源的地址 + 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置 +根据一个URL就能找到唯一的一个资源 \- URL的格式 +基本URL包含协议、主机域名(服务器名称\\IP地址)、路径 +举例: http://www.520it.com/ios/images/content\_25.jpg +可以简单认为: URL == 协议头://主机域名/路径 \- 常见的URL协议头(URL类型) +http\\https :超文本传输协议资源, 网络资源 +ftp :文件传输协议 +file :本地电脑的文件 \- URL的创建 +传入完整的字符串创建 \`\`\` NSURL \*url = \[NSURLURLWithString:@"file:///Users/LNJ/Desktop/str.txt"\]; \`\`\` +通过文件路径创建(默认就是file协议的) \`\`\` NSURL \*url = \[NSURLfileURLWithPath:@"/Users/LNJ/Desktop/str.txt"\]; \`\`\` \#\#3.使用NSURL读写字符串 \- 从URL中读取 \`\`\` // 用来保存错误信息 NSError \*error = nil; // 创建URL路径 // NSString \*path =@"file://192.168.199.119/Users/LNJ/Desktop/lnj.txt"; // 本机可以省略主机域名 // NSString \*path = @"file:///Users/LNJ/Desktop/lnj.txt"; NSURL \*url = \[NSURL URLWithString:path\]; // 利用fileURLWithPath方法创建出来的URL默认协议头为file:// NSURL \*url = \[NSURLfileURLWithPath:@"/Users/LNJ/Desktop/lnj.txt"\]; // 读取文件内容 NSString \*str = \[NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error\]; // 如果有错误信息 if (error) \{ NSLog(@"读取失败, 错误原因是:%@", \[error localizedDescription\]); \} else \{ // 如果没有错误信息 NSLog(@"读取成功, 文件内容是:\\n%@", str); \} \`\`\` \- 写入URL中 \`\`\` NSString \*str = @"江哥"; \[str writeToURL:\[NSURLURLWithString:@"/Users/LNJ/Desktop/lnj.txt"\] atomically:YES encoding:NSUTF8StringEncodingerror:nil\]; \`\`\` \# 字符串比较 \#\#1.NSString大小写处理 \- 全部字符转为大写字母 +\\- (NSString \*)uppercaseString; \- 全部字符转为小写字母 +\\- (NSString \*)lowercaseString \- 首字母变大写,其他字母都变小写 +\\- (NSString \*)capitalizedString \--- \#\#2.NSString比较 \- \\- (BOOL)isEqualToString:(NSString\*)aString; +两个字符串的内容相同就返回YES, 否则返回NO \`\`\` NSString \*str1 = @"lnj"; NSString \*str2 = \[NSString stringWithFormat:@"lnj"\]; if (\[str1 isEqualToString:str2\]) \{ NSLog(@"字符串内容一样"); \} if (str1 == str2) \{ NSLog(@"字符串地址一样"); \} \`\`\` \- \\- (NSComparisonResult)compare:(NSString\*)string; +这个方法可以用来比较两个字符串内容的大小 +比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果 +NSComparisonResult是一个枚举,有3个值: \* 如果左侧 > 右侧,返回NSOrderedDescending, \* 如果左侧 < 右侧,返回NSOrderedAscending, \* 如果左侧 == 右侧返回NSOrderedSame \`\`\` NSString \*str1 = @"abc"; NSString \*str2 = @"abd"; switch (\[str1 compare:str2\]) \{ case NSOrderedAscending: NSLog(@"后面一个字符串大于前面一个"); break; case NSOrderedDescending: NSLog(@"后面一个字符串小于前面一个"); break; case NSOrderedSame: NSLog(@"两个字符串一样"); break; \} 输出结果: 后面一个字符串大于前面一个 \`\`\` \- \\- (NSComparisonResult)caseInsensitiveCompare:(NSString \*)string; +忽略大小写进行比较,返回值与compare:一致 \`\`\` NSString \*str1 = @"abc"; NSString \*str2 = @"ABC"; switch (\[str1 caseInsensitiveCompare:str2\]) \{ case NSOrderedAscending: NSLog(@"后面一个字符串大于前面一个"); break; case NSOrderedDescending: NSLog(@"后面一个字符串小于前面一个"); break; case NSOrderedSame: NSLog(@"两个字符串一样"); break; \} 输出结果:两个字符串一样 \`\`\` \# 字符串搜索 \#\#1.字符串搜索 \- \\- (BOOL)hasPrefix:(NSString \*)aString; +是否以aString开头 \- \\- (BOOL)hasSuffix:(NSString \*)aString; +是否以aString结尾 \- \\- (NSRange)rangeOfString:(NSString\*)aString; +用来检查字符串内容中是否包含了aString +如果包含, 就返回aString的范围 +如果不包含, NSRange的location为NSNotFound, length为0 \--- \#\#2.NSRange基本概念 \- NSRange是Foundation框架中比较常用的结构体, 它的定义如下: \`\`\` typedef struct \_NSRange \{ NSUInteger location; NSUInteger length; \} NSRange; // NSUInteger的定义 typedef unsigned int NSUInteger; \`\`\` \- NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围 \- NSRange有2个成员 +NSUInteger location : 表示该范围的起始位置 +NSUInteger length : 表示该范围内的长度 \- 比如@“I love LNJ”中的@“LNJ”可以用location为7,length为3的范围来表示 \--- \#\#3.NSRange的创建 \- 有3种方式创建一个NSRange变量 \- 方式1 \`\`\` NSRange range; range.location = 7; range.length = 3; \`\`\` \- 方式2 \`\`\` NSRange range = \{7, 3\}; 或者 NSRange range = \{.location = 7,.length =3\}; \`\`\` \- 方式3 : 使用NSMakeRange函数 \`\`\` NSRange range = NSMakeRange(7, 3); \`\`\` \# 字符串截取 \#\#1.字符串的截取 \- \\- (NSString\*)substringFromIndex:(NSUInteger)from; +从指定位置from开始(包括指定位置的字符)到尾部 \`\`\` NSString \*str = @"<head>小码哥</head>"; str = \[str substringFromIndex:7\]; NSLog(@"str = %@", str); 输出结果: 小码哥</head> \`\`\` \- \\- (NSString\*)substringToIndex:(NSUInteger)to; +从字符串的开头一直截取到指定的位置to,但不包括该位置的字符 \`\`\` NSString \*str = @"<head>小码哥</head>"; str = \[str substringToIndex:10\]; NSLog(@"str = %@", str); 输出结果: <head>小码哥 \`\`\` \- \\- (NSString\*)substringWithRange:(NSRange)range; +按照所给出的NSRange从字符串中截取子串 \`\`\` NSString \*str = @"<head>小码哥</head>"; NSRange range; /\* range.location = 6; range.length = 3; \*/ range.location = \[str rangeOfString:@">"\].location + 1; range.length = \[str rangeOfString:@"</"\].location -range.location; NSString \*res = \[str substringWithRange:range\]; NSLog(@"res = %@", res); 输出结果: 小码哥 \`\`\` \# 字符串替换 \#\#1.字符串的替换函数 \- \\- (NSString\*)stringByReplacingOccurrencesOfString:(NSString \*)target withString:(NSString\*)replacement; +用replacement替换target \`\`\` NSString \*str = @"http:\*\*520it.com\*img\*ljn.gif"; NSString \*newStr = \[strstringByReplacingOccurrencesOfString:@"\*" withString:@"/"\]; NSLog(@"newStr = %@", newStr); 输出结果: http://www.520it.com/img/ljn.gif \`\`\` \- \\- (NSString\*)stringByTrimmingCharactersInSet:(NSCharacterSet \*)set; +去除首尾 \`\`\` NSString \*str = @" http://520it.com/img/ljn.gif "; NSString \*newStr = \[str stringByTrimmingCharactersInSet:\[NSCharacterSetwhitespaceCharacterSet\]\]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); 输出结果: str =| http://520it.com/img/ljn.gif | newStr =|http://520it.com/img/ljn.gif| \`\`\` NSString \*str = @"\*\*\*http://520it.com/img/ljn.gif\*\*\*"; NSString \*newStr = \[str stringByTrimmingCharactersInSet:\[NSCharacterSetcharacterSetWithCharactersInString:@"\*"\]\]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); 输出结果: str =|\*\*\*http://520it.com/img/ljn.gif\*\*\*| newStr =|http://520it.com/img/ljn.gif| \`\`\` \# 字符串与路径 \#\#1.NSString与路径 \- \\- (BOOL)isAbsolutePath; +是否为绝对路径 \`\`\` // 其实就是判断是否以/开头 // NSString \*str = @"/Users/NJ-Lee/Desktop/lnj.txt"; NSString \*str = @"Users/NJ-Lee/Desktop/lnj.txt"; if (\[str isAbsolutePath\]) \{ NSLog(@"是绝对路径"); \}else \{ NSLog(@"不是绝对路径"); \} \`\`\` \- \\- (NSString \*)lastPathComponent; +获得最后一个目录 \`\`\` // 截取最后一个/后面的内容 NSString \*str = @"/Users/NJ-Lee/Desktop/lnj.txt"; NSString \*component = \[str lastPathComponent\]; NSLog(@"component = %@", component); \`\`\` \- \\- (NSString\*)stringByDeletingLastPathComponent; +删除最后一个目录 \`\`\` // 其实就是上次最后一个/和之后的内容 NSString \*str = @"/Users/NJ-Lee/Desktop/lnj.txt"; NSString \*newStr = \[str stringByDeletingLastPathComponent\]; NSLog(@"newStr = %@", newStr); \`\`\` \- \\- (NSString\*)stringByAppendingPathComponent:(NSString \*)str; +在路径的后面拼接一个目录 (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容) \`\`\` // 其实就是在最后面加上/和要拼接得内容 // 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个 // NSString \*str = @"/Users/NJ-Lee/Desktop"; NSString \*str = @"/Users/NJ-Lee/Desktop/"; NSString \*newStr = \[strstringByAppendingPathComponent:@"lnj"\]; NSLog(@"newStr = %@", newStr); \`\`\` \#\#2.NSString与文件拓展名 \- \\- (NSString \*)pathExtension; +获得拓展名 \`\`\` // 其实就是从最后面开始截取.之后的内容 // NSString \*str = @"lnj.txt"; NSString \*str = @"abc.lnj.txt"; NSString \*extension = \[str pathExtension\]; NSLog(@"extension = %@", extension); \`\`\` \- \\- (NSString\*)stringByDeletingPathExtension; +删除尾部的拓展名 \`\`\` // 其实就是上次从最后面开始.之后的内容 // NSString \*str = @"lnj.txt"; NSString \*str = @"abc.lnj.txt"; NSString \*newStr = \[str stringByDeletingPathExtension\]; NSLog(@"newStr = %@", newStr); \`\`\` \- \\- (NSString\*)stringByAppendingPathExtension:(NSString \*)str; +在尾部添加一个拓展名 \`\`\` // 其实就是在最后面拼接上.和指定的内容 NSString \*str = @"lnj"; NSString \*newStr = \[strstringByAppendingPathExtension:@"gif"\]; NSLog(@"newStr = %@", newStr); \`\`\` \# 字符串与基本数据类型转换 \#\#1. \- \\- (NSUInteger)length; +返回字符串的长度(有多少个文字) \- \\-(unichar)characterAtIndex:(NSUInteger)index; +返回index位置对应的字符 \--- \#\#2.字符串和其他数据类型转换 \- 转为基本数据类型 +\\- (double)doubleValue; +\\- (float)floatValue; +\\- (int)intValue; \`\`\` NSString \*str1 = @"110"; NSString \*str2 = @"10"; int res = str1.intValue + str2.intValue; NSLog(@"res = %i", res); \`\`\` NSString \*str1 = @"110"; NSString \*str2 = @"10.1"; double res = str1.doubleValue + str2.doubleValue; NSLog(@"res = %f", res); \`\`\` \- 转为C语言中的字符串 +\\- (char \*)UTF8String; \`\`\` NSString \*str = @"abc"; const char \*cStr = \[str UTF8String\]; NSLog(@"cStr= %s", cStr); \`\`\` char \*cStr = "abc"; NSString \*str = \[NSString stringWithUTF8String:cStr\]; NSLog(@"str = %@", str); \`\`\` \# NSMutableString练习 \#\#1.NSMutableString练习 \- 从要求讲3个520it拼接在一起 \- 会生成很多新的字符串 \`\`\` NSString \*res = @""; NSString \*subStr = @"520"; // 1.拼接字符串 // res = \[res stringByAppendingString:subStr\]; // res = \[res stringByAppendingString:@" "\]; // // res = \[res stringByAppendingString:subStr\]; // res = \[res stringByAppendingString:@" "\]; // // res = \[res stringByAppendingString:subStr\]; // res = \[res stringByAppendingString:@" "\]; for (int i = 0; i < 3; ++i) \{ res = \[res stringByAppendingString:subStr\]; res = \[res stringByAppendingString:@" "\]; \} // 2.删除末尾的空格 // res = \[res stringByTrimmingCharactersInSet:\[NSCharacterSetwhitespaceCharacterSet\]\]; res = \[res substringToIndex:res.length - 1\]; NSLog(@"res = |%@|", res); \`\`\` \- 不会生成新的字符串 \`\`\` NSString \*subStr = @"520it"; NSMutableString \*res = \[NSMutableString string\]; // 1.拼接字符串 for (int i = 0; i < 3; ++i) \{ \[res appendString:subStr\]; \[res appendString:@" "\]; \} // 2.删除空格 // \[res replaceCharactersInRange:NSMakeRange(res.length - 1, 1)withString:@""\]; \[res deleteCharactersInRange:NSMakeRange(res.length - 1, 1)\]; NSLog(@"res = |%@|", res); \`\`\` \# NSMutableString常用方法 \#\#1.NSMutableString常用方法 \- \\- (void)appendString:(NSString\*)aString; +拼接aString到最后面 \`\`\` \- \\- (void)appendFormat:(NSString \*)format,...; +拼接一段格式化字符串到最后面 \`\`\` NSMutableString \*strM = \[NSMutableString string\]; NSLog(@"strM = %@", strM); \[strM appendString:@"lnj"\]; NSLog(@"strM = %@", strM); \`\`\` \- \\-(void)deleteCharactersInRange:(NSRange)range; +删除range范围内的字符串 \`\`\` NSMutableString \*strM = \[NSMutableStringstringWithString:@"http://www.520it.com"\]; // 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容 NSRange range = \[strM rangeOfString:@"http://"\]; \[strM deleteCharactersInRange:range\]; NSLog(@"strM = %@", strM); \`\`\` \- \\- (void)insertString:(NSString \*)aStringatIndex:(NSUInteger)loc; +在loc这个位置中插入aString \`\`\` NSMutableString \*strM = \[NSMutableStringstringWithString:@"www.520it.com"\]; \[strM insertString:@"http://" atIndex:0\]; NSLog(@"strM= %@", strM); \`\`\` \- \\-(void)replaceCharactersInRange:(NSRange)range withString:(NSString \*)aString; +使用aString替换range范围内的字符串 \`\`\` NSMutableString \*strM = \[NSMutableStringstringWithString:@"http://www.520it.com/lnj.png"\]; NSRange range = \[strM rangeOfString:@"lnj"\]; \[strM replaceOccurrencesOfString:@"lnj"withString:@"jjj" options:0 range:range\]; NSLog(@"strM = %@", strM); \`\`\` \#\#2.字符串使用注意事项 \- @”lnj”这种方式创建的字符串始终是NSString,不是NSMutalbeString.所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。 \`\`\` NSMutalbeString \*s1 = @”lnj”; // 会报错 \[strM insertString:@"my name is "atIndex:0\]; \`\`\` \# NSArray 遍历 \#\#1.NSArray的下标遍历 \`\`\` NSArray \*arr = @\[p1, p2, p3, p4, p5\]; for (int i = 0; i < arr.count; ++i) \{ Person \*p = arr\[i\]; \[p say\]; \} \`\`\` \#\#2.NSArray的快速遍历 \`\`\` NSArray \*arr = @\[p1, p2, p3, p4, p5\]; for (Person \*p in arr) \{ \[p say\]; \} \`\`\` \#\#3.NSArray 使用block进行遍历 \`\`\` \[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL \*stop) \{ NSLog(@"obj = %@, idx = %lu", obj, idx); Person \*p = obj; \[p say\]; \}\]; \`\`\` \#\#4.NSArray给所有元素发消息 \- 让集合里面的所有元素都执行aSelector这个方法 +\\- (void)makeObjectsPerformSelector:(SEL)aSelector; +\\- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument; \`\`\` // 让数组中所有对象执行这个方法 // 注意: 如果数组中的对象没有这个方法会报错 // \[arr makeObjectsPerformSelector:@selector(say)\]; \[arr makeObjectsPerformSelector:@selector(eat:)withObject:@"bread"\]; \`\`\` \# NSArray排序 \#\#1.NSArray排序 \- Foundation自带类排序 \`\`\` NSArray \*arr = @\[@(1), @(9), @(5), @(2)\]; NSArray \*newArr = \[arrsortedArrayUsingSelector:@selector(compare:)\]; \`\`\` \- 自定义类排序 \`\`\` NSArray \*arr = @\[p1, p2, p3, p4, p5\]; // 默认按照升序排序 NSArray \*newArr = \[arr sortedArrayWithOptions:NSSortConcurrentusingComparator:^NSComparisonResult(Person \*obj1, Person \*obj2) \{ return obj1.age > obj2.age; \}\]; NSLog(@"%@", newArr); \--- \# NSArray文件读写 \#\#1.NSArray数据写入到文件中 \`\`\` NSArray \*arr = @\[@"lnj", @"lmj", @"jjj",@"xcq"\]; BOOL flag = \[arrwriteToFile:@"/Users/LNJ/Desktop/persons.plist" atomically:YES\]; NSLog(@"%i", flag); \`\`\` \#\#2.从文件中读取数据到NSArray中 \`\`\` NSArray \*newArr = \[NSArrayarrayWithContentsOfFile:@"/Users/LNJ/Desktop/persons.xml"\]; NSLog(@"%@", newArr); \`\`\` \# NSArray 与字符串 \#\#1.把数组元素链接成字符串 \- \\- (NSString\*)componentsJoinedByString:(NSString \*)separator; +这是NSArray的方法, 用separator作拼接符将数组元素拼接成一个字符串 \`\`\` NSArray \*arr = @\[@"lnj", @"lmj", @"jjj",@"xcq"\]; NSString \*res = \[arr componentsJoinedByString:@"\*"\]; NSLog(@"res = %@", res); 输出结果: lnj\*lmj\*jjj\*xcq \`\`\` \#\#2.字符串分割方法 \- \\- (NSArray\*)componentsSeparatedByString:(NSString \*)separator; +这是NSString的方法,将字符串用separator作为分隔符切割成数组元素 \`\`\` NSString \*str = @"lnj-lmj-jjj-xcq"; NSArray \*arr = \[str componentsSeparatedByString:@"-"\]; NSLog(@"%@", arr); 输出结果: ( lnj, lmj, jjj, xcq ) \# Foundation框架介绍 \#\#1.Foundation框架介绍 \- 什么是框架? +众多功能\\API的集合 +框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架 \- Foundation框架的作用 +Foundation框架是Mac\\iOS中其他框架的基础 +Foundation框架包含了很多开发中常用的数据类型: \* 结构体 \* 枚举 \* 类 \- 如何使用Foundation框架 +Foundation框架中大约有125个可用的头文件,作为一个简单的形式,可以简单地使用以下语句导入\#import<Foundation/Foundation.h>因为Foundation.h文件实际上导入其他所有Foundation框架中的头文件 \- Foundation框架中的类 +Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形) +Foundation框架提供了非常多好用的类, 比如 \`\`\` NSString : 字符串 NSArray : 数组 NSDictionary : 字典 NSDate : 日期 NSData : 数据 NSNumber : 数字 \`\`\` \- Foundation框架中的类都是以NS为前缀(Next Step的缩写) +乔布斯于1976年创立苹果公司 +乔布斯于1985年离开苹果公司, 创立NeXT公司, 开发了Next Step操作系统 +在开发Next Step操作系统过程中产生了Foundation框架 +1997年, 苹果公司收购NeXT公司, 乔布斯重返苹果公司(Mac系统就是基于NextStep系统) +2007年, 苹果公司发布了iOS系统(iOS系统基于Mac系统) \--- \#\#2.Foundation框架常见错误 \- 有时候会在不经意之间修改了系统自带的头文件,比如NSString.h, 这时会出现以下错误: !\[\](http://7xj0kx.com1.z0.glb.clouddn.com/foundationerror.png) \- 解决方案很简单, 只需要删除Xcode的缓存即可 +缓存路径是/Users/用户名/Library/Developer/Xcode/DerivedData(默认情况下, 这是一个隐藏文件夹) \- 要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下 +显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true +隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false +(输入指令后, 一定要重新启动Finder) \# NSArray基本概念 \#\#1.NSArray的基本概念 \- 什么是NSArray? +NSArray是OC中的数组类,开发中建议尽量使用NSArray替代C语言中的数组 +C语言中数组的弊端 \* int array\[4\] = \{10, 89, 27, 76\}; \* 只能存放一种类型的数据.(类型必须一致) \* 不能很方便地动态添加数组元素、不能很方便地动态删除数组元素(长度固定) \- NSArray的使用注意 +只能存放任意OC对象, 并且是有顺序的 +不能存储非OC对象, 比如int\\float\\double\\char\\enum\\struct等 +它是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素 \--- \#\#2.NSArray的创建方式 \- \\+ (instancetype)array; \- \\+(instancetype)arrayWithObject:(id)anObject; \- \\+ (instancetype)arrayWithObjects:(id)firstObj,...; \- \\+ (instancetype)arrayWithArray:(NSArray\*)array; \- \\+ (id)arrayWithContentsOfFile:(NSString\*)path; \- \\+ (id)arrayWithContentsOfURL:(NSURL\*)url; \--- \#\#3.NSArray 的使用注意事项 \- NSArray直接使用NSLog()作为字符串输出时是小括号括起来的形式。 \- NSArray中不能存储nil,因为NSArray认为nil是数组的结束(nil是数组元素结束的标记)。nil就是0。0也是基本数据类型,不能存放到NSArray中。 \`\`\` NSArray \*arr = \[NSArray arrayWithObjects:@"lnj", nil,@"lmj",@"jjj", nil\]; NSLog(@"%@", arr); 输出结果: ( lnj ) \`\`\` \#\#4.NSArray的常用方法 \- \\- (NSUInteger)count; +获取集合元素个数 \- \\- (id)objectAtIndex:(NSUInteger)index; +获得index位置的元素 \- \\- (BOOL)containsObject:(id)anObject; +是否包含某一个元素 \- \\- (id)lastObject; +返回最后一个元素 \- \\- (id)firstObject; +返回最后一个元素 \- \\-(NSUInteger)indexOfObject:(id)anObject; +查找anObject元素在数组中的位置(如果找不到,返回-1) \- \\- (NSUInteger)indexOfObject:(id)anObjectinRange:(NSRange)range; +在range范围内查找anObject元素在数组中的位置 \--- \#\#5.NSArray的简写形式 \- 自从2012年开始, Xcode的编译器多了很多自动生成代码的功能, 使得OC代码更加精简 \- 数组的创建 +之前 \`\`\` \[NSArray arrayWithObjects:@"Jack",@"Rose", @"Jim", nil\]; \`\`\` +现在 \`\`\` @\[@"Jack", @"Rose",@"Jim"\]; \`\`\` \- 数组元素的访问 +之前 \`\`\` \[array objectAtIndex:0\]; \`\`\` +现在 \`\`\` array\[0\]; \`\`\` \# NSMutableArray基本概念 \#\#1.NSMutableArray介绍 \- 什么是NSMutableArray +NSMutableArray是NSArray的子类 +NSArray是不可变的,一旦初始化完毕后,它里面的内容就永远是固定的, 不能删除里面的元素, 也不能再往里面添加元素 +NSMutableArray是可变的,随时可以往里面添加\\更改\\删除元素 \--- \#\#2.NSMutableArray基本用法 \- 创建空数组 \`\`\` NSMutableArray \*arr = \[NSMutableArrayarray\]; \`\`\` \- 创建数组,并且指定长度为5,此时也是空数组 \`\`\` NSMutableArray \*arr2 = \[\[NSMutableArrayalloc\] initWithCapacity:5\]; \`\`\` \- 创建一个数组,包含两个元素 \`\`\` NSMutableArray \*arr3 = \[NSMutableArrayarrayWithObjects:@"1",@"2", nil\]; \`\`\` \- 调用对象方法创建数组 \`\`\` NSMutableArray \*arr4 = \[\[NSMutableArrayalloc\] initWithObjects:@"1",@"2", nil\]; \`\`\` \- \\- (void)addObject:(id)object; +添加一个元素 \- \\- (void)addObjectsFromArray:(NSArray\*)array; +添加otherArray的全部元素到当前数组中 \- \\- (void)insertObject:(id)anObjectatIndex:(NSUInteger)index; +在index位置插入一个元素 \- \\- (void)removeLastObject; +删除最后一个元素 \- \\- (void)removeAllObjects; +删除所有的元素 \- \\-(void)removeObjectAtIndex:(NSUInteger)index; +删除index位置的元素 \- \\- (void)removeObject:(id)object; +删除特定的元素 \- \\-(void)removeObjectsInRange:(NSRange)range; +删除range范围内的所有元素 \- \\- (void)replaceObjectAtIndex:(NSUInteger)indexwithObject:(id)anObject; +用anObject替换index位置对应的元素 \- \\-(void)exchangeObjectAtIndex:(NSUInteger)idx1withObjectAtIndex:(NSUInteger)idx2; +交换idx1和idx2位置的元素 \--- \#\#3.NSMutableArray 错误用法 \- 不可以使用@\[\]创建可变数组 \`\`\` NSMutableArray \*array = @\[@"lnj",@"lmj", @"jjj"\]; // 报错, 本质还是不可变数组 \[array addObject:@“Peter”\]; \`\`\` \# NSMutableString基本概念 \#\#1.NSMutableString 基本概念 \- NSMutableString 类 继承NSString类,那么NSString
还没有评论,来说两句吧...