04-OC中的Foundation框架


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>字符串常量保存在内存空间的常量区内,对于内容相同的字符串常量,常量区只能保存一份,所以对于str1str11的内存地址是一样的


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.NSMutableStringNSString的区别


-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操作

本质是:没有产生新的对象


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值