标签:
编号 | 标题 | 内容 |
---|---|---|
一 | protocol | protocol 基本概念/语法格式/protocol和继承区别/使用注意/基协议/@required和@optional关键字/类型限制 |
二 | 代理设计模式 | 代理设计模式基本概念/示例/练习/编写的规范 |
三 | Foundation框架介绍 | Foundation框架介绍/常见错误 |
四 | NSString | NSString基本概念/创建方式 |
五 | 字符串的处理 | 读写/比较/搜索/截取/替换函数 |
六 | 字符串与路径 | NSString与路径/NSString与文件拓展名 |
一.Protocol
Protocol翻译过来, 叫做”协议”
Protocol的作用
@protocol 协议名称 // 方法声明列表
@end
类遵守协议
创建协议的步骤
@interface 类名 : 父类 <协议名称1, 协议名称2,…> @end
示例
@protocol SportProtocol <NSObject> //方法的声明 - (void)playFootball; - (void)playBasketball; - (void)playBaseball; @end #import "SportProtocol.h" // 导入协议的头文件 @interface Studnet : NSObject <SportProtocol> // 遵守协议 @end @implementation Student // 实现协议方法 - (void)playBasketball { NSLog(@"%s", __func__); } // 实现协议方法 - (void)playFootball { NSLog(@"%s", __func__); } @end
@protocol SportProtocol <NSObject> { int _age; // 错误,不能声明成员变量 } - (void)playFootball; - (void)playBasketball; @end
@protocol SportProtocol <NSObject> - (void)playFootball; - (void)playBasketball; @end #import "SportProtocol.h" @interface Student : NSObject <SportProtocol> @end @interface GoodStudent : Student @end @implementation GoodStudent - (void)playFootball { NSLog(@"%s", __func__); } - (void)playBasketball { NSLog(@"%s", __func__); } @end
#import "SportProtocol.h" #import "StudyProtocol.h" @interface Student : NSObject <SportProtocol, StudyProtocol> @end
@protocol A -(void)methodA; @end #import "A.h" @protocol B <A> -(void)methodB; @end #import "B.h" @interface Student : NSObject <B> //同时拥有A/B协议中的方法声明 -(void)methodA; -(void)methodB; @end
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法
建议每个新的协议都要遵守NSObject协议
@protocol SportProtocol <NSObject> // 基协议 - (void)playFootball; - (void)playBasketball; @end
程序员之间的交流
,并不能严格的控制某一个遵守该协议的类必须实现该方法,不实现只会报警告,不报错@protocol SportProtocol <NSObject> @required // 如果遵守协议的类不实现会报警告 - (void)playFootball; @optional //如果遵守协议的类不实现不会报警告 - (void)playBasketball; - (void)playBasketball; @end
设定情景:
从题目中我们得到要求
@protocol WifeCondition<NSObject> - (void)cooking; - (void)washing; - (void)job; @end
// 如果没有遵守协议则会报警告 id<WifeCondition> wife = [[Person alloc] init];
Person.h中
@property (nonatomic, strong) Wife<wifeCondition> *wife;
if([self.wife respondsToselector:@selector(cooking)]) { [self.wife cooking]; }
什么是设计模式(能够高效完成程序的代码总结)
什么是代理设计模式
代理设计模式的场合:
监听
对象A的一些行为(让对象B成为对象A的代理对象)告知
对象B(让对象B成为对象A的代理对象)帮忙
处理(让对象B成为对象A的代理对象)// 协议 #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) int drowsiness; // 饿 - (void)hungry; // 困意 - (void)sleepy; //如果使用id类型接收保姆,当换保姆时,婴儿类不需要修改 @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
Student类: - (void)studentFindHouse; Student类的协议:StudentProtocol:- (void)findHouse; LinkHome类:代理
什么是框架?
Foundation框架的作用
如何使用Foundation框架
Foundation框架中的类
NSString : 字符串
NSArray : 数组
NSDictionary : 字典
NSDate : 日期
NSData : 数据
NSNumber : 数字
Foundation框架中的类都是以NS为前缀(Next Step的缩写)
解决方案很简单, 只需要删除Xcode的缓存即可
要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下
什么是NSString?
NSString应用场景
NSString *str1 = @"hmj"; NSString *str3 = @"hmj"; NSLog(@"str1 = %p, str3 = %p", str1, str3); 输出地址一致
通过alloc init创建/initWithFormat
通过类工厂方法创建/stringWithFormat
NSString *str2 = [NSString stringWithFormat:@"hmj"]; NSString *str4 = [NSString stringWithFormat:@"hmj"]; NSLog(@"str2 = %p, str4 = %p", str2, str4); 输出地址不一样
NSString *str2 = [[NSString alloc] initWithFormat:@"height is %f". 1.75];
// 用来保存错误信息 NSError *error = nil; // 读取文件内容 NSString *str = [NSString //全路径/绝对路径 stringWithContentsOfFile:@"/Users/MJ-Hee/Desktop/hmj.txt" //编码 encoding:NSUTF8StringEncoding //指向指针的指针 error:&error]; // 如果有错误信息 if (error) { NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]); } else { // 如果没有错误信息 NSLog(@"读取成功, 文件内容是:\n%@", str); }
写入文件中
atomically
NSString *str = @"贺梦洁"; BOOL flag = [str writeToFile:@"/Users/MJ-Hee/Desktop/hmj.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; if (flag == 1) { NSLog(@"写入成功"); }
NSString *str1 = @"贺梦洁"; BOOL flag = [str1 writeToFile:@"/Users/MJ-Hee/Desktop/hmj.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSString *str2 = @"贺梦洁"; [str2 writeToFile:@"/Users/MJ-Hee/Desktop/hmj.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSString *str = [NSString stringWithContentsOfFile:@"/Users/MJ-Hee/Desktop/hmj.txt" encoding:NSUTF8StringEncoding error:&error]; NSLog(@"str = %@", str); 输出结果:贺梦洁
什么是URL
URL的格式
常见的URL协议头(URL类型)
URL的创建
//协议头 + 主机地址 + 文件路径
NSURL *url = [NSURL URLWithString:@"file://192.168.14.37/Users/MJ-Hee/Desktop/str.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/MJ-Hee/Desktop/str.txt"];
// 用来保存错误信息 NSError *error = nil; // 创建URL路径 // NSString *path = @"file://192.168.199.119/Users/MJ-Hee/Desktop/hmj.txt"; // 本机可以省略主机域名 // NSString *path = @"file:///Users/MJ-Hee/Desktop/hmj.txt"; NSURL *url = [NSURL URLWithString:path]; // 利用fileURLWithPath方法创建出来的URL默认协议头为file:// NSURL *url = [NSURL fileURLWithPath:@"/Users/MJ-Hee/Desktop/hmj.txt"]; // 读取文件内容 NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // 如果有错误信息 if (error) { NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]); } else { // 如果没有错误信息 NSLog(@"读取成功, 文件内容是:\n%@", str); }
注意
URL不支持中文
,如果URL中包含中文,那么无法访问;但如果是通过fileURLWithPath创建的,那么系统内不会自动对URL中包含的中文进行处理,不会影响访问
- path = [path stringByAddingPercentEscaesUsingEncoding:NSUTF8StringEncoding];
写入URL中
NSString *str = @"贺梦洁"; [str writeToURL:[NSURL URLWithString:@"/Users/MJ-Hee/Desktop/hmj.txt"] atomically:YES encoding:NSUTF8StringEncoding error:nil];
注意点
全部字符转为大写字母
全部字符转为小写字母
首字母变大写,其他字母都变小写
NSString *str1 = @"hmj"; NSString *str2 = [NSString stringWithFormat:@"hmj"]; //比较字符串内容是否相同 if ([str1 isEqualToString:str2]) { NSLog(@"字符串内容一样"); } //是比较字符串的地址是否相同 if (str1 == str2) { NSLog(@"字符串地址一样"); }
NSString *str1 = @"abc"; NSString *str2 = @"abd"; switch ([str1 compare:str2]) { case NSOrderedAscending: NSLog(@"后面一个字符串大于前面一个"); break; case NSOrderedDescending: NSLog(@"后面一个字符串小于前面一个"); break; case NSOrderedSame: NSLog(@"两个字符串一样"); break; } 输出结果: 后面一个字符串大于前面一个
NSString *str1 = @"abc";
NSString *str2 = @"ABC";
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"后面一个字符串大于前面一个");
break;
case NSOrderedDescending:
NSLog(@"后面一个字符串小于前面一个");
break;
case NSOrderedSame:
NSLog(@"两个字符串一样");
break;
}
输出结果:两个字符串一样
- (BOOL)hasPrefix:(NSString *)aString;
- (BOOL)hasSuffix:(NSString *)aString;
- (NSRange)rangeOfString:(NSString *)aString;
typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; // NSUInteger的定义 typedef unsigned int NSUInteger;
NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
NSRange有2个成员
比如@“I love HMJ”中的@“HMJ”可以用location为7,length为3的范围来表示
NSRange range; range.location = 7; range.length = 3;
NSRange range = {7, 3}; 或者 NSRange range = {.location = 7,.length = 3};
NSRange range = NSMakeRange(7, 3);
NSString *str = @"<head>小码哥</head>"; str = [str substringFromIndex:7]; NSLog(@"str = %@", str); 输出结果: 小码哥</head>
NSString *str = @"<head>小码哥</head>"; str = [str substringToIndex:10]; NSLog(@"str = %@", str); 输出结果: <head>小码哥 //<head>小码哥</head>-->小码哥</head>-->小码哥 NSString *str = @"<head>小码哥</head>"; NSUInteger location = [str rangeOfString:@">"].location + 1; NSString *newStr = [str substringFromIndex:location]; location = [str rangeOfString:@"</"].location - 1; str = [newstr substringToIndex:location]; NSLog(@"str = %@", str); <head>小码哥</head>--><head>小码哥-->小码哥
NSString *str = @"<head>小码哥</head>"; NSRange range; //NSRange range = {6, 3}; /* range.location = 6; range.length = 3; */ //只要是OC提供的结构体,一般都可以使用NSMakeXXX来创建 //NSRange range = NSMakeRange(6, 3); //动态获取起始位置 range.location = [str rangeOfString:@">"].location + 1; //NSUInteger location = [str rangeOfString:@">"].location + 1; //动态获取截取长度 range.length = [str rangeOfString:@"</"].location - range.location; //NSUInteger length = [str rangeOfString:@"<" options:NSBackwardsSearch].location - location; //NSRange range = NSMakeRange(location, length); //截取字符串 NSString *res = [str substringWithRange:range]; //输出截取的字符串 NSLog(@"res = %@", res); 输出结果: 小码哥
//将&替换成/ NSString *str = @"http:**520it.com*img*hmj.gif"; //OccurrencesOfString:被替换的字符串 //withString:用什么字符串替换 NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"]; NSLog(@"newStr = %@", newStr); 输出结果: http://www.520it.com/img/ljn.gif
NSString *str = @" http://520it.com/img/ljn.gif "; NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; NSString *newStr = [str stringByTrimmingCharactersInSet:set]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); 输出结果: str =| http://520it.com/img/hmj.gif | newStr =|http://520it.com/img/hmj.gif| NSString *str = @"***http://520it.com/img/ljn.gif***"; NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); 输出结果: str =|***http://520it.com/img/hmj.gif***| newStr =|http://520it.com/img/hmj.gif|
NSString *str = @" http://520it.com/img/hmj.gif "; NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet]; NSString *newStr = [str stringByTrimmingCharactersInSet:set]; NSLog(@"str =|%@|", str); NSLog(@"newStr =|%@|", newStr); 输出结果: str =|HTTP://520it.com/img/hmj.GIF| newStr =|://520it.com/img/hmj.|
// 其实就是判断是否以/开头 // NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt"; NSString *str = @"Users/MJ-Hee/Desktop/hmj.txt"; if ([str isAbsolutePath]) { NSLog(@"是绝对路径"); }else { NSLog(@"不是绝对路径"); } 结果:不是绝对路径
// 截取最后一个/后面的内容 NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt"; NSString *component = [str lastPathComponent]; NSLog(@"component = %@", component); 结果:hmj.txt
// 其实就是上次最后一个/和之后的内容 NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt"; NSString *newStr = [str stringByDeletingLastPathComponent]; NSLog(@"newStr = %@", newStr); 结果:/Users/MJ-Hee/Desktop
// 其实就是在最后面加上/和要拼接得内容 // 注意会判断后面有没有/,有就不添加了, 没有就添加, 并且如果有多个会替换为1个 // NSString *str = @"/Users/MJ-Hee/Desktop"; NSString *str = @"/Users/MJ-Hee/Desktop/"; NSString *newStr = [str stringByAppendingPathComponent:@"hmj"]; NSLog(@"newStr = %@", newStr); 结果:/Users/MJ-Hee/Desktop/hmj
// 其实就是从最后面开始截取.之后的内容 // NSString *str = @"hmj.txt"; NSString *str = @"abc.hmj.txt"; NSString *extension = [str pathExtension]; NSLog(@"extension = %@", extension); 结果:txt
// 其实就是上次从最后面开始.之后的内容 // NSString *str = @"hmj.txt"; NSString *str = @"abc.hmj.txt"; NSString *newStr = [str stringByDeletingPathExtension]; NSLog(@"newStr = %@", newStr); 结果:abc.hmj
// 其实就是在最后面拼接上.和指定的内容 NSString *str = @"hmj"; NSString *newStr = [str stringByAppendingPathExtension:@"gif"]; NSLog(@"newStr = %@", newStr); 结果:hmj.gif
标签:
原文地址:http://www.cnblogs.com/HMJ-29/p/4703301.html