总结

编号 标题 内容
protocol protocol 基本概念/语法格式/protocol和继承区别/使用注意/基协议/@required和@optional关键字/类型限制
代理设计模式 代理设计模式基本概念/示例/练习/编写的规范
Foundation框架介绍 Foundation框架介绍/常见错误
NSString NSString基本概念/创建方式
字符串的处理 读写/比较/搜索/截取/替换函数
字符串与路径 NSString与路径/NSString与文件拓展名

一.Protocol

1.protocol 基本概念
  • Protocol翻译过来, 叫做”协议”

    • 在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的
    • protocol它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的
  • Protocol的作用

    • 用来声明一些方法
    • 也就说,一个Protocol是由一系列的方法声明组成的
2.protocol 语法格式
  • Protocol的定义
@protocol 协议名称
// 方法声明列表
@end
  • 类遵守协议

    • 一个类可以遵守1个或多个协议
    • 任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法的声明
  • 创建协议的步骤

    • Object-C-->File Type:Protocol

      @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
3.protocol和继承区别
  • 继承之后默认就有实现,而protocol只有声明没有实现
  • 相同类型的类可以使用继承,但是不同类型的类只能使用protocol
  • protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可
4.protocol 的使用注意
  • 1)Protocol:就一个用途,用来声明方法(不能声明成员变量),不能写实现。
@protocol SportProtocol <NSObject>
{
int _age; // 错误,不能声明成员变量
}
- (void)playFootball;
- (void)playBasketball;
@end
  • 2)只要父类遵守了某个协议,那么子类也遵守,如果子类中没有实现该方法,那么就会调用父类的方法
@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
  • 3)OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >),OC中只有单继承
#import "SportProtocol.h"
#import "StudyProtocol.h" @interface Student : NSObject <SportProtocol, StudyProtocol> @end
  • 4)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明
@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
5.基协议
  • NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

  • 还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议

  • NSObject协议中声明很多最基本的方法

    • description
    • retain
    • release
  • 建议每个新的协议都要遵守NSObject协议

@protocol SportProtocol <NSObject> // 基协议

- (void)playFootball;
- (void)playBasketball;
@end
6.@required和@optional关键字
  • 协议中有2个关键字可以控制方法是否要实现(默认是@required)

    • @required:这个方法必须要实现(若不实现,编译器会发出警告)
    • @optional:这个方法不一定要实现
  • 作用域跟成员变量修饰符一样
  • 注意
    • 如果没有使用任何关键字修饰协议的方法,那么默认是@required
    • 如果协议中的方法是@required,但遵守协议的类不实现该方法,那么就会报警告
    • 如果协议中的方法是@optional,但遵守协议的类不实现该方法,那么不会报警告
    • 用途在于程序员之间的交流,并不能严格的控制某一个遵守该协议的类必须实现该方法,不实现只会报警告,不报错
@protocol SportProtocol <NSObject>

@required // 如果遵守协议的类不实现会报警告
- (void)playFootball;
@optional //如果遵守协议的类不实现不会报警告
- (void)playBasketball;
- (void)playBasketball;
@end
7.protocol类型限制
  • 设定情景:

    • 某攻城狮A希望找一个会做饭、洗衣服的女生做女朋友,有国企工作的优先。
    • 满足条件的女生都可以向他发送消息
  • 从题目中我们得到要求

    • 会做饭
    • 会洗衣服
    • 有份好工作
@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];
}

二. 代理设计模式

1.主要概念
  • 什么是设计模式(能够高效完成程序的代码总结)

    • 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
  • 什么是代理设计模式

    • 帮助某一个对象完成某一些操作
  • 代理设计模式的场合:

    • 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
    • 当对象A发生了一些行为,想告知对象B(让对象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) 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
  • 有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款成为代理人
3.代理设计模式练习
  • 学生通过中介找房子的过程,学生不知道怎么找所以让代理帮忙找
Student类: - (void)studentFindHouse;
Student类的协议:StudentProtocol:- (void)findHouse;
LinkHome类:代理
  • 协议编写的规范

    • 一般情况下,当前协议属于谁,就将协议定义到谁的头文件中
    • 协议名称后面要写上基协议()
    • 协议的名称一般以它属于的那个类的类名开头,后面跟上protocol或者delegate
    • 协议中的方法名称一般以协议的名称protocol之前的作为开头
    • 一般情况下协议中的方法会将触发该协议的对象传递出去
    • 一般情况下,一个类中的代理的名称叫做delegate
    • 当某一个类要成为一个类的代理的时候,一般情况下,在.h中用@protocol 协议名称;告诉当前类,这是一个协议/在.m中用 #import 类的头文件;真正导入一个协议所在的.h文件

三. Foundation框架介绍

1.Foundation框架介绍
  • 什么是框架?

    • 众多功能API(应用程序接口Application Program Interface)的集合
    • 框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易在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系统就是基于Next Step系统)
    • 2007年,苹果公司发布了iOS系统(iOS系统基于Mac系统)
2.Foundation框架常见错误
  • 有时候会在不经意之间修改了系统自带的头文件, 比如NSString.h,这时会出现以下错误:
  • 解决方案很简单, 只需要删除Xcode的缓存即可

    • 缓存路径是/Users/用户名/Library/Developer/Xcode/Derived Data(默认情况下, 这是一个隐藏文件夹)
    • window --> project --> 点小箭头删除文件
  • 要想看到上述文件夹, 必须在终端敲指令显示隐藏文件夹, 指令如下

    • 显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
    • 隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false
    • (输入指令后, 一定要重新启动Finder)

四. NSString

1.NSString基本概念
  • 什么是NSString?

    • 一个NSString对象就代表一个字符串(文字内容)
    • 一般称NSString为字符串类
  • NSString应用场景

2.NSString创建方式
  • 最直接的方式(常量字符串)

    • 常量区中的字符串只要内容一致, 不会重复创建
    • 存储在常量区
      NSString *str1 = @"hmj";
      NSString *str3 = @"hmj";
      NSLog(@"str1 = %p, str3 = %p", str1, str3);
      输出地址一致

  • 通过alloc init创建/initWithFormat

    • 字符串存储在堆中
  • 通过类工厂方法创建/stringWithFormat

    • 堆区中得字符串哪怕内容一致, 也会重复创建
    • 封装了alloc init
      NSString *str2 = [NSString stringWithFormat:@"hmj"];
      NSString *str4 = [NSString stringWithFormat:@"hmj"];
      NSLog(@"str2 = %p, str4 = %p", str2, str4);
      输出地址不一样
       

  • 注意
    • 不同的平台存储的方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就会不一样
    • 不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次alloc都会创建一个新对象,如果是Xcode6以上并且是在iOS平台,那么alloc多次都会指向同一块存储空间
    • 一般情况下,只要通过alloc或者通过类工厂方法创建的对象,每次都会在堆内存中开辟一块新的存储空间
    • 如果是通过alloc的initWithString方法除外
      NSString *str2 = [[NSString alloc] initWithFormat:@"height is %f". 1.75];

五.字符串的处理

1.直接读写文件中的字符
  • 从文件中读取
// 用来保存错误信息
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

    • 如果传入YES,字符串写入文件的过程没有完成,那么不会生成文件
    • 如果传入NO,字符串写入文件的过程没有完成,会生成文件
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); 输出结果:贺梦洁
2.NSURL简介
  • 什么是URL

    • URL的全称是Uniform Resource Locator(统一资源定位符)
    • URL是互联网上标准资源的地址
    • 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
    • 根据一个URL就能找到唯一的一个资源
  • URL的格式

  • 常见的URL协议头(URL类型)

  • URL的创建

    • 传入完整的字符串创建
//协议头 + 主机地址 + 文件路径
NSURL *url = [NSURL URLWithString:@"file://192.168.14.37/Users/MJ-Hee/Desktop/str.txt"];
  • -

    • 通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/MJ-Hee/Desktop/str.txt"];

读写

3.使用NSURL读写字符串
  • 从URL中读取
// 用来保存错误信息
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中的主机地址可以省略,但文件路径中最前面的/不能省略(/代表文件的根路径)
    • 如果通过NSURL的fileURLWithPath方法创建URL,那么系统会自动给我们传入字符串添加协议头(file://),所以字符串不需要写file://
    • 开发中一般情况下,如果是访问本机的资源,创建URL的时候,建议使用fileURLWithPath
      • 因为URL不支持中文,如果URL中包含中文,那么无法访问;但如果是通过fileURLWithPath创建的,那么系统内不会自动对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];

注意点

    • 如果多次往同一个文件中写入,后一次写入的内容会覆盖前一次写入的内容

比较

4.NSString大小写处理
  • 全部字符转为大写字母

    • - (NSString *)uppercaseString;
  • 全部字符转为小写字母

    • - (NSString *)lowercaseString
  • 首字母变大写,其他字母都变小写

    • - (NSString *)capitalizedString
5.NSString比较
  • - (BOOL)isEqualToString:(NSString *)aString;

    • 两个字符串的内容相同就返回YES, 否则返回NO
    NSString *str1 = @"hmj";
NSString *str2 = [NSString stringWithFormat:@"hmj"]; //比较字符串内容是否相同
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;
      }
      输出结果:两个字符串一样

搜索

6.字符串搜索
  • - (BOOL)hasPrefix:(NSString *)aString;

    • 是否以aString开头
  • - (BOOL)hasSuffix:(NSString *)aString;

    • 是否以aString结尾
  • - (NSRange)rangeOfString:(NSString *)aString;

    • 用来检查字符串内容中是否包含了aString
    • 如果包含, 就返回aString在str中的起始位置和长度
    • location从0开始,length从1开始
    • 如果不包含,NSRange(结构体)的location为NSNotFound, length为0
7.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 HMJ”中的@“HMJ”可以用location为7,length为3的范围来表示

8.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);

截取

9.字符串的截取
  • - (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>小码哥 //<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 *)substringWithRange:(NSRange)range;

    • 按照所给出的NSRange从字符串中截取子串
    • NSRange:位置和长度
   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);
输出结果: 小码哥
  • 注意

    • rangeOfString是从左至右的开始查找,只要找到了就不继续找了
    • 从哪里开始查找
      • options:NSBackwardsSearch从后往前找

替换

10.字符串的替换函数
  • - (NSString )stringByReplacingOccurrencesOfString:(NSString)target withString:(NSString *)replacement;

    • 用replacement替换target
//将&替换成/
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 )stringByTrimmingCharactersInSet:(NSCharacterSet)set;

    • 去除首尾的空格
    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.|

六. 字符串与路径

1.NSString与路径
  • - (BOOL)isAbsolutePath;

    • 是否为绝对路径

      • 其实就是判断是否以/开头
 // 其实就是判断是否以/开头
// NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt";
NSString *str = @"Users/MJ-Hee/Desktop/hmj.txt";
if ([str isAbsolutePath]) {
NSLog(@"是绝对路径");
}else
{
NSLog(@"不是绝对路径");
} 结果:不是绝对路径
  • - (NSString *)lastPathComponent;

    • 获得最后一个目录

      • 截取最后一个/后面的内容
    // 截取最后一个/后面的内容
NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt";
NSString *component = [str lastPathComponent];
NSLog(@"component = %@", component); 结果:hmj.txt
  • - (NSString *)stringByDeletingLastPathComponent;

    • 删除最后一个目录

      • 其实就是上次最后一个/和之后的内容
 // 其实就是上次最后一个/和之后的内容
NSString *str = @"/Users/MJ-Hee/Desktop/hmj.txt";
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"newStr = %@", newStr); 结果:/Users/MJ-Hee/Desktop
  • - (NSString *)stringByAppendingPathComponent:(NSString *)str;

    • 在路径的后面拼接一个目录 (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
// 其实就是在最后面加上/和要拼接得内容
// 注意会判断后面有没有/,有就不添加了, 没有就添加, 并且如果有多个会替换为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
2.NSString与文件拓展名
  • - (NSString *)pathExtension;

    • 获得拓展名
    • 从后往前找.,找到后将.后的内容返回
  // 其实就是从最后面开始截取.之后的内容
// NSString *str = @"hmj.txt";
NSString *str = @"abc.hmj.txt";
NSString *extension = [str pathExtension];
NSLog(@"extension = %@", extension); 结果:txt
  • - (NSString *)stringByDeletingPathExtension;

    • 删除尾部的拓展名
    • 从字符串的末尾开始查找,删除第一.和.后面的内容
// 其实就是上次从最后面开始.之后的内容
// NSString *str = @"hmj.txt";
NSString *str = @"abc.hmj.txt";
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"newStr = %@", newStr); 结果:abc.hmj
  • - (NSString )stringByAppendingPathExtension:(NSString )str;

    • 在尾部添加一个拓展名
// 其实就是在最后面拼接上.和指定的内容
NSString *str = @"hmj";
NSString *newStr = [str stringByAppendingPathExtension:@"gif"];
NSLog(@"newStr = %@", newStr); 结果:hmj.gif

OC-代理,字符串的更多相关文章

  1. OC NSString(字符串)

    OC NSString(字符串) 多行文字字面量 NSString * string = @"abC" @"DEF" @"hjk" @&qu ...

  2. OC之字符串 NSString与NSMutableString

    一.NSString 不可变字符串的操作1)将字符串常量对象直接赋值给字符串引用 NSString *str1=@"hello"; 字符串对象的输出格式:NSLog(@" ...

  3. OC基础--字符串

    前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...

  4. iOS - OC NSString 字符串

    前言 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSM ...

  5. OC中字符串的提取与替换-四种不同方法实现

    /* 1.将可变字符串 @"When I was young, I loved a girl in neighbor class."中,从 young提取到girl.替换 成@&q ...

  6. OC 代理 协议 委托 数据源的概念

    (网摘) OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 ): 数据源就是对象遵循了存储数据的协议,可以存储使用数据 协议表示了方法可 ...

  7. OC 截取字符串

    1.定义一个字符串a, 截取a 的某一个部分,复制给b, b必须是int型 NSString *a = @"1.2.30"; int  b= [[a substringWithRa ...

  8. 61 (OC)* 代理 block 通知 代理 kvo

    1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高. block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者bloc ...

  9. OC字符串NSString

    ========================== 面向对象编程进阶和字符串 ========================== Δ一.类的设计模式—单例 [单例]程序允许过程中,有且仅有一块内存 ...

  10. OC字符串的一些常用的函数。

    )//获取字符串长度 NSUInteger len= str.length; () //通过指定索引返回对应的字符 unichar ch =[str characterAtIndex:]; ()//通 ...

随机推荐

  1. Flink 实践教程 - 入门(4):读取 MySQL 数据写入到 ES

    ​作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接. ...

  2. Python Nose 自动化测试框架介绍

    文章目录 1. unittest 简介 1.1 python 单元测试 1.2 unittest 测试框架 1.3 默认模式 1.4 手工模式 2. nose 扩展框架 2.1 `nose` 的安装和 ...

  3. vue如何写组件(script标签引入的方式)

    很多人知道.vue结构的单文件组件形式,不过这种单文件组件的结构如果要加入到现有的jquery项目中就比较麻烦了,那如果我们又想用vue来写模板,又不想引入vue-cli管理,那该怎么来写组件呢?别着 ...

  4. 用户案例 | 腾讯小视频&转码平台云原生容器化之路

    作者 李汇波,腾讯业务运维高级工程师,目前就职于TEG 云架构平台部 技术运营与质量中心,现负责微信.QQ社交类业务的视频转码运维. 摘要 随着短视频兴起和快速发展,对于视频转码处理的需求也越来越多. ...

  5. python中整除后结果也是小数

    有人这么回答,这显然不对 先看个例子: '//'明明是整除,为什么结果不是整数,而会出现小数? 首先,关于除法有三种概念:传统除法.精确除法和地板除 #1.传统除法:整数相除结果是整数,浮点数相除结果 ...

  6. 美团饿了么领取外卖优惠券微信小程序的开发及上线_怎样点外卖省钱_外卖小程序的开发及上线

    都1202年了,估计没人不知道外卖了,那么就有两种人在思考两种问题: 普通人:怎么点外卖划算? 程序员:怎么通过外卖赚钱? 话不多说,为了让你们相信我有能力来讲这块内容,先给你们看一个很简单的小程序: ...

  7. myeclipse trial expired暂时解决办法

    运行以下程序,生成key: import java.io.*; public class MyEclipseGen { private static final String LL = "D ...

  8. [bzoj1863]皇帝的烦恼

    二分枚举答案,假设是ans,考虑判定答案从前往后计算,算出每一个将军与第一个将军最少和最多有多少个相同的奖牌,贪心转移即可 1 #include<bits/stdc++.h> 2 usin ...

  9. 详解Python Streamlit框架,用于构建精美数据可视化web app,练习做个垃圾分类app

    今天详解一个 Python 库 Streamlit,它可以为机器学习和数据分析构建 web app.它的优势是入门容易.纯 Python 编码.开发效率高.UI精美. 上图是用 Streamlit 构 ...

  10. 最难忘的一次bug:谢谢实习时候爱学习的自己

    前言 时间的车轮一直向前不停,试图在时光洪流中碾碎一些久远的记忆.虽然记忆中的人离我越来越远,但是故事却越来越深刻. 当在博客园看到这次的正文题目是"最难忘的bug",脑海里瞬间浮 ...