Foundation框架
1. 什么是框架
众多功能API的集合
框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便为开发程序提供便利.
在OSX下的Mac系统有大约80多个框架,但是Foundation框架是Mac\iOS中其他框架的基础,所以掌握Foundation框架是开发ios程序必不可少的
2. Foundation框架有什么作用?
> Foundation框架是Mac\iOS中其他框架的基础框架
> Foundation框架包含许多开发中常用的数据类型: 结构体、枚举、类等.
3. 如何使用Foundation框架
> 要想使用Foundation框架中的功能,导入它的主头文件
#import 即可.
4. Foundation框架中常用的类
NSString : 字符串
NSArray : 数组
NSDictionary : 字典
NSDate : 日期
NSData : 数据
NSNumber : 数字
Foundation框架中的类都是以NS为前缀(Next Step的缩写)
NSString类
1. 什么是NSString类
> 一个NSString对象就代表一个字符串
> 一般称NSString为字符串类
2. 如何创建NSString对象?
创建字符串有多种方式,通过不同的方式创建字符串,字符串对象存储的位置也不一样.
> 如果是通过字符串常量创建NSString对象,那么字符串对象存储在常量区中.
> 如果是通过alloc initWithFormat / stringWithFormat创建,那么字符串对象存储在堆中.
注意:
> 不同平台的存储方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就是两个对象
> 不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次alloc都会创建一个新对象,如果是在
Xcode6以上那么alloc多次指向同一块存储空间
1): 通过字符串常量创建NSString对象(通过@""直接创建 ).
注意: 如果通过字符串常量创建对象,并且字符串常量的内容一致,那么如果创建多个字符串对象,多个对象指向同一存储空间.
NSString *str1 = @"gzy";
NSString *str11 = @"gzy";
NSLog(@"str1 = %p,str2 = %p",str1,str11)
2): 通过alloc init 创建
注意: 只要调用alloc就会在堆内存中开辟一块存储空间
NSString *str2 = [[NSString alloc]initWithFormat:@"gzy"];
3): 通过类工厂方法创建/ stringWithFormat
注意: 类工厂方法内部实质是封装了alloc init,所以通过类工厂方法创建, 那么会将字符串放到堆区中
NSString *str3 = [NSString stringWithFormat:@"zs"];
一般情况下,只要通过alloc或者类工厂方法创建的对象,每次都会在堆内存中开辟一份新的存储空间,但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们, 而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
NSString *str4 = [[NSString alloc]initWithString:@"ls"];
3. 从文件中读写字符串
> 从文件中读取字符串(
stringWithContentsOfFile)
参数解释:
file: 文件路径,
encoding: 编码英文 iOS-5988-1中文 GBK GBK2312 ,一般情况填写UTF-8
error: 如果读取错误,会将错误信息保存到error中 ,如果读取正确,就没有error = nil
注意:以后在OC方法中但凡看到XXXofFile的方法,传递的一定是全路径(绝对路径)
NSString *path = @"/Users/sunny/Desktop/默默/520/note/gzy.txt";
NSError *error = nil;
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"str = %@", str);
}else
{
NSLog(@"error = %@", [error localizedDescription]);
> 将字符串写入到文件中(writeToFile)
NSString *str = @"你好世界!";
// atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件
// 如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt";
BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"flag = %i", flag);
4. 从URL中读写字符串
1) : 什么是URL?
(1)URL的全称是Uniform Resource Locator(统一资源定位符) (2)URL是互联网上标准资源的地址 (3)互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置 (4)根据一个URL就能找到唯一的一个资源
2): URL格式
URL = 协议头://主机名称/路径
3): 如何创建URL
> 通过alloc 或者 类工厂方法创建
NSURL *url = [NSURL URLWithString:@"file:///Users/james/Desktop/str.txt"];
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/james/Desktop/str.txt"];
注意:
1. 如果加载的资源是本机上的资源,那么URL中的主机地址可以省略,虽然主机地址可以省略,但是需要注意,文件路劲中最前面的/不能省略,文件路径最前面的/代表根路径
2.如果使用URLWithString方法来创建URL,必须在创建URL之前先对字符串中的中文进行处理,进行百分号编码
NSString *path =@"/Users/sunny/OC代码/Function/字符串读写2/gzy.txt";
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:path];
> 通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:path];
注意
:
1. 如果是通过NSURL的fileURLWithPath:方法创建URL,那么系统会自动给我们传入的字符串添加协议头(file://),
以字符串中不需要再写file://
2. 开发中一般情况下,如果是访问本机的资源,创建URL的时候,建议使用fileURLWithPath方法创建
因为url不支持中文,如果URL中包含中文,那么无法访问;但是如果是通过fileURLWithPath方法创建URL,
哪怕URL中包含中文也可以进行访问,系统内部会自动对URL中包含的中文进行处理
URLWithString: 方法不支持中文,所以无法成功创建URL,必须先对路径字符串进行编码
fileURLWithPath: 方法支持中文,并且省略协议头,但是只能获取本地方法
1. 文件读取字符串(stringWithContentsOfURL)
//根据URL加载文件中的字符串
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
2. 将字符串写入到文件(writeOfURL)
NSString *str = @"gzy";
NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
NSURL *url = [NSURL fileURLWithPath:path];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
注意点:
如果多次往同一个文件中写入内容,那么后一次的会覆盖前一次的
方法名中没有file,路径中要添加上file协议头,如果方法名中有file,路径中就不需要file协议头
5. 字符串的比较.
1. 如何比较两个字符串的 "内容" 是否相同?(isEqualToString)
BOOL flag = [ str1 isEqualToString: str2];
NSLog(@”flag = %i”, flag);
2. 如何比较两个字符串的”地址”是否相同? (==)
flag = (str1 == str2);
NSLog(@”flag = %i”, flag);
3. 如何比较字符串的大小?(compare)
三个枚举常量:
NSOrderedAscending 前面小于后面的
NSOrderedSame 两个字符串相等
NSOrderedDescending 前面大于后面的
4. 忽略大小写进行比较(caseInsensitiveCompare)
[str1 caseInsensitiveCompare:str2]
6. 字符串搜索(字符串判断)
1. 判断是否以什么开头(hasPrefix)
本质: 就是从字符串的第一个字符开始匹配,只要不匹配就返回0
NSString *str =@"http://www.520it.com/img/lnj.gif";
if ([str hasPrefix:@"http://"]) {
NSLog(@"是一个URL");
}else{
NSLog(@"不是一个URL");
}
2. 判断是否以什么结尾( hasSuffix)
本质:就是从字符串的最后一个字符开始匹配,只要不匹配就返回NO
if ([str hasSuffix:@".gif"]) {
NSLog(@"动态图片");
}else{
NSLog(@"不是动态图片");
}
3. 判断字符串中是否包含指定字符串.(rangeOfString)
注意:
只要str中包含该字符串,那么就返回字符串在str中的起始位置,以及字符串的长度
如果str中没有需要查找的字符串,那么返回的range的length = 0,location = NSNotFound
NSRange range = [str rangeOfString:@"520"];
if (range.location == NSNotFound) {
NSLog(@"str字符串中没有需要查找的内容!");
}else{
NSLog(@"str字符串中有需要查找的内容!");
NSLog(@"location = %lu,length = %lu",range.location,range.length);
}
typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
} NSRange;
// NSUInteger的定义
typedef unsignedint NSUInteger;
- NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
- NSRange有2个成员
- NSUIntegerlocation : 表示该范围的起始位置
- NSUIntegerlength : 表示该范围内的长度
- 比如@“I love iOS”中的@“iOS”可以用location为7,length为3的范围来表示
NSRange的创建
- 有3种方式创建一个NSRange变量
NSRange range = {6,3};
>2.
NSRange range;
range.location =6;
range.length =3;
>3.
只要是OC提供的结构体,一般都可以使用NSMakeXXX来创建
NSRange range = NSMakeRange(6,3);
1.动态获取截取的起始位置
NSUInteger location = [str rangeOfString:@">"].location + 1;
2.动态获取截取的长度
注意:rangeOfString是从左至右的开始查找,只要找到就不找了
NSUInteger length = [str rangeOfString:@"
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?