Foundation框架
1.框架简介
1>众多功能\API的集合
2>要想使用Foundation框架中的功能,包含它的主文件即可
* #import <Foundation/Foundation.h>
2.Foundation下的常用类
NSString : 字符串—>子类NSMUtableString(可变)
NSArray : 数组 —>子类NSMUtableArray
NSDictionary : 字典 —>子类NSMUtableDictionary
NSDate : 日期
NSData : 数据
NSNumber : 数字
3 NSString(字符串)
1.字符串的内存问题
1>用NSString *str1=@"Hello world";(NSString *str11=@"Hello world";)创建的字符串是字符串常量
2>字符串常量保存在内存空间的常量区内,对于内容相同的字符串常量,常量区只能保存一份,所以对于str1和str11的内存地址是一样的
2.通过NSString读写文件
<1>本地读取和写入
1>写入文件 writeTofile
-BOOL isok=[msg writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:&err];
writeTofile:路径 atomically是否原子性 :YES encoding文件编码:UTF8 error错误:nil
*atomically是否原子性:YES写入成功后才执行,否则不执行
2>读取文件 stringwithContentsOfFile
-NSString *msg1=[NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:&err1 ];
[NSString stringwithContentsOfFile:路径 encoding文件编码:UTF8 error错误:nil]
3>error参数:(指向指针的指针)NSError
[err localizedEescription] 详细错误
NSError *err=nil;
[NSString stringwithContentsOfFile:路径 encoding文件编码:UTF8 error错误:&err]
使用时候要加上 &取地址符
<2>通过USURL进行文件读取
读:>NSString *msg1=[NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:&err1 ];
写:>BOOL isok=[msg writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:&err]
注意:
NSURL *url=[NSURL URLWithString:path];
*这种方式不能识别中文,并且路径前面要加上协议
3.NSString的常用方法
1>字符串转换为小写:lowercaseString
2>字符串转换为大写:uppercaseString
3>单词首字母大写:[s1 capitalizedString]
4>两个字符串的地址是否相同:s1==s2
5>比较两个字符串的内容是否相同[s1 isEqualToString:s1];
6>比较两个字符串的大小:
NSComparisonResult result=[s1 compare:s2]
//使用switch便利result
-NSComparisonResult
*NSOrderAscing 小于
*NSOrdersame 等于
*NSOrderDescing 大于
[s1 caseInsensitiveCompaer]
7>判读字符是否某个字符开头
[s1 hasPrefix:@“http”]
判读字符是否某个字符结尾
[s1 hasSudfix:@“png”]
判读字符是否包含某个字符
NSRange range=[s1 rageofString:@“itcast”];
无论是否找到了itcast 都会返回一个NSRange结构体,找到了返回位置信息,没有找到返回NSRange==NotFound(-1)
rageofString始终会找到在字符串中第一次找到的位置
加上option:NSBackwardsSearch属性找最后一个出现的位置
NSRange range=[s1 rageofString:@“itcast”option:NSBackwardsSearch];
8>截取字符串
从指定位置截取一直到最后:[s1 suubstrigFromIndex:2]
从开头到哪个位置结束(不包含结尾位置):[s2 suubstrigToIndex:2]
制定范围截取:
-创建一个range
Range range=NSMakeRange(02,4);
[s1 suubstrigWithrange:range]
9>替换
-将*换成/
[s1 stringByReplacngoccrrenesOfstring :@“*” withstring:”/” ]
10>
int—>string
NSString a=[NSString stringwithFormat:”%d”,n]
string—>int
int a=[a intValue]
11>OC转换为C
const char *s=[s1 UTF8String]
12>去除字符串首尾的空格
[s1 stringByTrimmingCharcterTnset [NSCharacterset whietspaceCharacterset]]
13>字符串拼接
[s1 stringByAppendingstring@“zzz”];
4.NSString字符串的不可变性
1> 指的是,一旦字符串被创建以后,那么该字符串在内存中的内容就不可以改变了
s1不断变化,是因为s1每次指向了不同的内存地址,[字符串本身没有变化]
NSString *s1=@“abc”;
s1=[s1 stringByAppendingstring@“zzz”];
2>字符串的不可变性造成的问题
当使用NSString字符串进行拼接的时候
1.会产生很多垃圾内存
2.会创建很多临时的字符串对象(创建对象本身就很耗费性能)
4.NSMutableString(可变字符串)
1.使用NSMutableString(可变字符串)进行拼接
1>只在一块内存中进行拼接
2.NSMutableString的常用方法(没有返回值)
1>创建NSMutableString:stringWithString
2>拼接一个新的字符串:appendString
3>以格式化的方式来追加字符串:appendFormat
4>删除指定范围内的字符串:deleteCharactersInRange
5>在指定位置插入字符串:insertString
6>替换指定范围idea字符串:replaceCharacterInRange
3.NSMutableString的string属性
1> NSMutableString *str=@“abc”;
不能这样写,因为@创建的是不可变字符串,不可变字符串没有appendString方法
2>string属性:创建一个空的NSMutableString,可通过string赋值.
4.NSMutableString和NSString的区别
-NSString是不可变的, 里面的文字内容是不能进行修改的
-NSMutableString是可变的, 里面的文字内容可以随时更改
*NSMutableString能使用NSString的所有方法
*大多数情况下NSString,只有频繁的操作字符串,(拼接,截取等)才会使用NSMutableString
5.NSArray(NSMutableArray)
集合(OC数组)
1>特点
-可以存储任意OC对象,并且是有顺序的
-不能存储非OCC对象,int\float\enum
-是不可变的,一旦初始化以后,里面内容不能再操作,长度不可变,只可读取。
2>创建NSArray的简单高效的方式
NSArray *array=@[@“乔丹”,@”科比”,”麦迪”];
3> NSArray常见方法
-array.count 数组数量
-array 以字符串格式输出
-array[3];输出指定索引处的集合元素[array objectIndex:3]
-BOOL A=[array containObject:@“乔丹”],是否包含某个对象
-firstObject,lastObject:返回第一个,最后一个元素
-根据对象返回对象的索引:
NSInteger index=[array indexObject:@“许海爬”];
存在返回该对象索引,否则返回-1
-指定范围之内搜索 (加属性):inRange:NSMakeRange(0,1);
4>遍历NSArray
-for
for(int i=0;i<array.count;i++)
{
NSLog(@“%@”,aray[i]);
}
-for in
for(NSString *item in array)
{
NSLog(@“%@”,item);
}
-3Block
-obj 元素内容
-idx 元素索引
-stop 是否终止循环 (YES/NO)
[array enumerateObjectsuSingBlock 回车,回车]
- 调用array中得每个对象的方法
[array makeObjsPerformSelector:(sayHi)]
- 调用array中得每个对象中带参数的方法
[array makeObjsPerformSelector:(sayHi:) withObject:@“hehe”];
5>NSArray的文件读写
-写文件:[array writeTofile:路径 原子性:YES]
-读文件:[NSSArray arayWithContentsFile:path](用NSSArray接收)
-NSURL格式和NSString一样。
6.NSString和NSarray
- 字符串分割:(NSString)
NSArray *arr=cpmponentsSeparateByString:@“|”;
- 字符串拼接(NSArray)
NSString *str=[array compintsJoinedByString:@*”];
6.NSMUtableArray
1>创建
NSMUtableArray *array=[NSMUtableArray array];
2>添加
[array addObject:@”切尔西”]
[array addObject:@”皇马”]
3>添加一个数组
[array addObjectFromArray:array1]
4>删除
1.根据对象删除 [array removeObject:@“皇马”]
(根据参数的值来删除,不是根据参数的地址删除)
2.删除所有元素
[array removeAllObjects]
3.删除最后一个
[array removeLateObject]
4.删除指定索引
[array removeObjectAtIndex:0]
5.删除指定范围的对象
[array removeObjectsInRange:range]
5>替换一个值
[array replaceObjectAtIndex:0 withObject:@“曼联”]
array[3]=@“曼联”;
6>交换两个元素
[array exchangeObjectAtindex:4 withObjectAtindex:2];
7.NSDictionary
1>字典简介
key value键值格式存储,key不能重复(重复选第一个不报错但没意义),无序,根据键取值
2>创建字典
NSDictionary *dic=@{@“zs”:”张三”,”ls”,”李四”};
3> dic.count字典键值对数量
4>根据键取值:dic[@“键”];
5>遍历
1.字典遍历顺序是不一定的,不能通过索引取值,所以不能用for循环遍历。
2.for (Nsstring *key in dic)
{
NSLog(@“键%@,值%@”,key,dic[key]);
}
3.[dic enumerateKeysAndObjectUsingBlock]
6>文件读取
写:writeToFle
读:dictionarytWithContentsofFile
8.NSMutableDictionary(可变的字符)
1>setobject 增加一个键值对
2>removeobjectForkey:@“zs”根据键,删除当前键值对
3> removeAlltobjects删除所有
9.NSNumber
1> 把基本的数字类型包装成OC对象(NSNumbe作用)
int n=100;
NSNumber *n=[NSNumber numWithInt:n]
(把int类型包装成了NSNumber)
NSNumber *number1=@(n);
2>从NSNumber中取出之前包装的基本数据类型
- n. intValue
- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
10.NSValue (包装任意基本数据类型)
1>包装结构体 valueWithPoint
-将CGPoint恶习包装成NSValue
NSValue *val=[NSValue valueWithPoint:point]
11.NSDate 表示日期时间
1>当前时间
[NSDate date](0时区)
NSDate=*nowdate=[NSDate date]
2>把NSDate日期格式化成对应的字符串格式
1.创建一个日期格式化器
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
2.指定你要的格式
-yyyy 年
-MM 月
-dd 日
-hh 小时(12)
-HH (24)
-mm 分钟
-ss 秒
formatter.dateFormat=@“yyyy年MM月dd日 HH:mm:ss”;
3.执行格式化
NSString *date=[formatter stringFromDate:@“nowdate”];
3>通过NSCalendar对象获取日期的每一部分
//获取当前日期对象
NSDate *nowDate=[NSDate date]
//创建一个NSCalendar对象(日历牌对象)
NSClendar *c=[NSClendar current Clendar]
//通过NSClendar获取指定日期的某一部分
NSDateComponents *cmp=[c components:传年月日,from:nowdate]
//输出日期的某一部分
cmp.year com.mouth com.day 年月日
12. Foundation下的结构体
1>结构体的声明与赋值
1.声明
struct 结构体名{参数1,参数2,参数3}
struct Date{int year,int mouth,int day};
2.赋值
struct Date d={2011,3,1};(按顺序赋值)
struct Date d1={.year=2011,.mouth=3,.day=1};(不按顺序)
2>常用结构体
- NSRange 范围
- NSPoint 表示一个点 (CG/Point)
- NSSize 表示大小的结构体
- NSRict 即封装了point也封装了size
-NSRange(location length)
1.解释:范围(位置,长度)
2.用法:调用NSMakeRange(位置,长度)函数
NSRange r=NSMakeRange(2,4)
3.查找某个字符串在str中得范围
NSString *str=@“I love oc”;
NSrange r=[str rangeofstring:@“love”];
[字符串 rangeofstring:@“要查找的字符””]
-如果找不到 lengh=0,location=NSNotFount(-1)
-NSPoint\CGPoint(x,y) 点
CGPoint P1=NSMakePoint(10,10);
NSPoint P1=CGPointMake(10,10);
-NSSize\CGSize(width,height)尺寸
CGSize c1= NSMakeSize(100,500);
NSSize c1= CGSizeMake(100,500);
-NSRect \CGRect(CGPoint, CZSize)
CGRect r1= CGRectMake(100,100,100,100);
4.结构体和字符串互转
-将结构体转换成字符串
NSString *str=NSStringFromRect(r);
-将字符串转换成结构体
NSRect rrr=NSRectFromString(str);
3>结构体常用函数
1.比较两个点是否相同(x,y)(比较size,rect都可以)
BOOL b=CGPointEqualToPoint(CGPointMake(0, 0), CGPointMake(22, 22));
13.NSSet
1>创建
NSSet *s=[NSSet set];
NSSet *s=[NSSet setWithObjects:@“jack”,@“tom”];
s.count(数量)
2>读取
-随机取出一个对象
NSString *s=[s anyObject];
14.NSMutableSet
1>创建
NSMutableSet *s=[NSMutableSet set];
2>添加
[s addObject:@“hack”];
3>删除
-只能删除指定对象
-因为NSMutableSet是无序的,所以不能通过索引操作
[s renmoveObjeck:@“hack”]
4> NSArray和NSSet区别
-共同点
*都是集合,都能存放OC对象
*只能存放OC对象,不能存放非OC对象(基本数据类型:int char float等等,结构体,枚举)
-不同点
* NSArray有顺序, NSSet无顺序
15.NSFileManager
1>单例模式
在整个应用程序只有一个对象
2>创建对象
NSFileManager *mgr=NSFileManager defaultManager]
3>判断指定的路径,是否存在(文件/文件夹)
BOOL b=[mgr fileExistsAtPath]
4>path代表文件是否存在,isDirectory返回是文件还是文件夹
//保存是否是文件夹(是YES 否NO)
bool isDir;
//bool的b判断路径是否存在
bool b=[mgr fileExistsAtPath:path isDirectory:&isDir]
5>判断文件权限
- bool b=[mgr isReadableFileAtPath:path]
文件或文件夹是否可读可写可删除
- (BOOL)isReadableFileAtPath:(NSString *)path;
文件或文件夹是否可读
- (BOOL)isWritableFileAtPath:(NSString *)path;
文件或文件夹是否可写
-(BOOL)isDeletableFileAtPath:(NSString *)path;
文件或文件夹是否可删除
6>获得文件\文件夹的属性
(NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
NSDictionary *attrs = [fileMgr attributesOfItemAtPath:path error:&err];
*输出文件大小:使用封装的常量 NSFileSize
NSLog(@"%@", attrs[NSFileSize]);
7>获得path的当前子路径(path下的所有直接子内容,path必须是一个目录/文件夹)
(NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
8>获得path的所有子路径/后代路径(所有文件),上面两个方法功能一样
(NSArray *)subpathsAtPath:(NSString *)path;
(NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
9>复制,剪切,删除
- 拷贝
(BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- 移动(剪切)
(BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;
- 删除
(BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
10>创建目录
[mgr createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]
*withIntermediateDirectories 是否创建自动创建中间文件夹 (表示中间路径没有,那么是否需要创建)
11>创建文件(Data)
- NSData是用来存储二进制字节数据的
- 把字符串转换为NSData
NSString *s1 =[@"hello"];
NSData *data = [s1 dataUsingEncoding:NSUTF8StringEncoding];
12> 获得文件内容(Data)
(NSData *)contentsAtPath:(NSString *)path;
13>Data与NSString互转
- NSData-> NSString
NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding];
- NSString->NSData
NSString *aString = @"1234abcd";
NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding];
14>集合的内存管理问题
1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1
3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
普遍规律(一般情况下)
1> 如果方法名是add\insert开头(把对象加到某个数组或集合中),那么被添加的对象,计数器会+1
2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
16.Copy(对象的拷贝)
1>含义
把对象在内存里创建一个副本
2>目的
要使用某个对象数据,但是在修改对象的时候不影响原对象内容。
3>copy和mutablecopy的使用
- copy:创建的是不可变的副本(NSString等)
- mutablecopy:创建的是可变的副本(NSMutableString等)
4>使用copy功能的前提
copy : 需要遵守NSCopying协议,实现copyWithZone:方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
mutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
5>总结
- 要拷贝一个对象可以调用copy或mutablecopy
- copy和mutablecopy区别
1>copy:产生一个不可变副本
2> mutablecopy:产生一个可变副本
- 不是任何一个类型都有能调用copy方法或者mutablecopy,必须遵守NScopying或NSmutablecopying协议,才可以使用copyWithZone方法或mutableCopyWithZone方法。
-自己写得类不能是使用copy,因为没有遵守协议。
6>深拷贝和浅拷贝
深复制(深拷贝,内容拷贝,deep copy)
源对象和副本对象是不同的两个对象
源对象引用计数器不变, 副本对象计数器为1(因为是新产生的)
本质是:产生了新的对象
浅复制(浅拷贝,指针拷贝,shallow copy)
源对象和副本对象是同一个对象
源对象(副本对象)引用计数器 + 1, 相当于做一次retain操作
本质是:没有产生新的对象