1.Foundation框架提供的常用结构体有:
(1)NSRange:这个结构体用来表示事物的一个范围,一般用于查找指定位置范围内的字符串及字符。
Location表示该范围的起始位置。
Length表示该范围内所含的元素个数。
定义:typedef struct _NSRange {
NSUInteger location;
NSUInteger length;
}NSRange;
创建一个NSRange变量的三种方式:
第一种:NSRange range;
Range.location =7;
Range.length =3;
第二种:应用C语言的聚合结构赋值机制
NSRange range =(7,3);//表示从第7个位置开始,查找3个元素
或者NSRange range ={.location =7, .length =3};
第三种:Foundation 框架提供的一个快捷函数NSMakeRange,可以用它来查找指定范围内的字符串。
NSRange range = NSMakeRange(7,3);
打印时可以把这种结构体转换成字符串输出:
NSPoint p =(1,3);
NSString *str = NSStringFromPoint(p);
输出结果为:{1,10}
扩展:CG开头代表是CoreGraphics框架。CF代表是CoreFoundation框架。
NS前缀由来:因为乔布斯之前创办的公司叫NextStep。
(2)NSSize:这个结构体用来存储宽度和高度。=CGSize
定义:struct CGSize{
CGFloat width;
CGFloat height;
};
Typedef struct CGSize CGSize;
可以利用NSMakeSize()和CGSizeMake()创建CGSize;
(3)NSRect :这个结构体可以用来存储宽度和高度。 =CGRect
定义:struct CGRect{
CGPoint origin; //矩形左上角坐标
CGSize size; //矩形的宽度和高度
};
Typedef struct CGRect CGRect;
可以利用NSMakeRect()和CGRectMake()创建CGRect
2、结构体常用的类有:这些类的内存不需要手动管理,系统会自动释放。
(1)NSString:不可变的字符串。
1)、创建常量字符串: NSString *string = @”This is a String!”;
2)、创建空字符串,给予赋值: NSString *string =[[NSString alloc] init];
String =@”This is a String!”;
3)、通过字符串创建字符串:char * c =”这是一串中文”;
[[NSString alloc] initWithString:@”This is a String!”];这种创建方式会自动释放内存,不需要再release了。
3、NSString常用的几种方法:
(1).uppercaseString:把字符串转变成大写。
(2).lowercaseString:把字符串转变成小写。
(3) capitalizedString:首字母变大写,其他字母都变小写。
(4) isEqualToString:检测两个字符串的内容是否相同。
(5) Compare:比较两个字符串的内容。返回值有三种:NSOrderedAscending(左侧小于右侧),NSOrderedDescending(左侧大于右侧),NSOrderedSame(两侧相等)
(6) caseInsensitiveCompare:忽略大小写进行比较,返回值与compare一致。
(7) hasPrefix: 是否以某字符串开头,是返回1,否返回0.
(8) hasSuffix: 是否以某字符串结尾,是返回1,否返回0.
(9) rangeOfString:字符串的搜索,返回字符串出现的起始位置和字符串的长度。默认是从左往右进行搜索。
NSRange range = [str rangeOfString:@”456” options:NSBackwardsSearch]代表从尾部进行搜索字符串。
(10) subStringFromIndex:字符串的截取。从给出的索引位置开始截取。
(11) subStringToIndex: 字符串的截图。 从头开始截取到给出的索引位置止
(12) subStringWithRange:截取指定范围的字符串。
(13) componentsSeparatedByString:根据给出的字符串进行分割一个字符串。
(14) pathWithComponents:把数组中的所有字符串拼接成一个路径。
(15) pathComponents: 把一个路径切割成数组输出。
(16) isAbsolutePath: 判断一个路径是否是绝对路径。判断原理就是判断是否从根路径开始,即从”/”开始。
(17) lastPathComooponent: 返回最后一个目录名。
(18) stringByDeletingLastComoponent: 返回去掉最后目录的一个文件路径。
(19) stringByAppendingPathComponent: 在最后面拼接一个目录。
(20) pathExtension: 获得拓展名。
(21) stringByDeletingPathExtension: 删除尾部的拓展名。
(22) stringByAppendingPathExtension: 在尾部添加一个拓展名。
(23) Length:返回字符串的长度。
(24) characterAtIndex:返回index位置对应的字符。
(25) doubleValue 、floatValue、 intValue :强制转换字符串类型。
(26) UTF8String: 返回C语言的字符串。
4、NSMutableString:可变的字符串。
1)、创建可变的字符串常用方法:
- (id) initWithCapacity:(NSUInteger) capacity
+ (id) stringWithCapacity:(NSUInteger) capacity
Capacity 预分配最优值,只是告诉内存先按照capacity这个值先分配一块内存用来存储数据,目的是为了使操作速度变快。
2)、常用的一些方法:
(1) setString:初始化完毕后可以使用此方法设置字符串的内容。
(2) appendString/appendFormat: 这两个方法都是在尾部拼接一段字符串。
(3) replaceCharactersInRange:(NSRange) range withString:(NSString *) aString:将range位置的字符串替换为aString
(4) insertString:(NSString *) aString atIndex:(NSUInteger) loc:在loc这个位置插入aString(aString的起始位置就是loc).
(5) deleteCharactersInRange:(NSRange) range:删掉range这个范围的字符串。
5、NSArray数组:用来存储对象的有序列表,它是不可变的。不能存储C语言中的基本数据类型,如int,float,enum,struct,也不能存储nil
(1)创建NSArray的常用方法:
+(id) array:这种是静态方法创建一个数组,是不用管内存的,系统会自动处理。
+(id)arrayWithObject:(id) anObject:只支持装入OC对象,不支持装入常用类:int,float
(2) 常用的一些方法:
Count:获取集合元素的个数。
ContainObject:是否包含某一个元素
LastObject:返回最后一个元素。
objectAtIndex:获得index位置对象的元素。
IndexOfObject:(id)anObjet inRange:(NSRange) range:在range范围内查找元素的位置。
IsEqualToArray:比较两个集合内容是否相同。
FirstObjectCommonWithArray:返回两个集合中第一个相同的对象元素。
-(void)makeObjectsPersormSelector:(SEL)aSelector:给数组元素发送消息。
-(void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id) argument
6、数组中的内存状况:
要点:当把一个对象塞进一个数组时,数组会对它进行一次retain操作,计数器会加1。但数组被销毁时,它会对里面所有的对象都进行一次release操作。
7、数组的遍历:
第一种:用for语句
NSArray *array = [NSArray arrayWithObject:@”1”,@”2”,@”3”,nil];
Int a = array.count;
For(int i ; i<a;i++){
Id object =[array objetAtIndex:i]
NSLog(@”%i——%@”,i,obj);
}
第二种:快速遍历,类似js的语法
NSArray *array = [NSArray arrayWithObject:@”1”,@”2”,@”3”,nil];
Int i = 0;
For(id obj in array){
NSLog(@”%i——%@”,i,obj);
i++;
}
第三种数组遍历:
NSArray *array = [NSArray arrayWithObject:@”1”,@”2”,@”3”,nil];
[array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){//三个参数:对象,索引,判断到第几个索引就让其停止的指针,默认是到数组结尾。
//如果索引为1,就停止遍历
If(idx ==1){
//利用指针修改外面BOOL变量的值
*stop =YES;
}
}];
第四种数组遍历方式:迭代方法
NSArray *array = [NSArray arrayWithObject:@”1”,@”2”,@”3”,nil];
//获取数组的迭代器
NSEnumerator *enumerator =[array objectEnumerator];
//获取下一个需要遍历的元素
Id obj = nil;
While(obj =[enumerator nextObjet]){
NSLog(@”obj=%@”,obj);
}
第五种数组遍历方法:返回所有元素。
NSArray *array =[enumerator allObjects];
NSLog(@”array:%@”,array);
缺陷:如果前面已有遍历过了,那么这个方法将从遍历过的那个索引开始再接着遍历。
8、NSArray派生出新的集合
-(NSArray *)arrayByAddingObject:(id) anObject
添加一个新的元素,返回一个新的NSArray(方法调用者本身没有改变)
-(NSArray *) arrayByAddingObjectsFromArray:(NSArray *) otherArray
添加otherArray的所有元素,返回一个新的NSArray(方法调用者本身没有改变)
-(NSArray *) subarrayWithRange:(NSRange) range
截取range范围的数组元素
-(NSString *)componentsJoinedByString:(NSString *) separator
用separator作拼接符将数组元素拼成一个字符串
-(BOOL)writeToFile:(NSString *) path atomically:(BOOL) useAuxiliaryFile
将一个NSArray持久化到文件中去。
9、数组排序
第一种排序方法:
Void arraySort1(){
NSArray *array = [NSArray arrayWithObjects:@”2”,@”3”,@”1”,@”4”,nil];
//返回一个排好序的数组,原来的顺序不会改变。
NSArray *array2 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@”array2:%@”, array2);
}
第二种排序方法:
Void arraySort2(){
Student *stu1 = [Student studentWithFirstname:@”MingJie”];
}
10、ArrayMutableArray:可变数组,即可以扩展数组元素的数组。
11、NSDictionaly:不可变字典,即通过关键字去找对应的对象。
12、NSMuDictionaly:可变字典,可以随便添加键值对来扩充字典的元素。
13、NSNumber:可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray、NSDictionary等集合中。是NSValue的子类。
14、NSValue:可以包装任意值,也就可以用NSValue包装结构体后加入NSArray、NSDictionary等集合中。NSValue在使用过程中,接收的对象比NSNumber较为广泛。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSPoint p = NSMakePoint(3, 4);
NSValue *v = [NSValue valueWithPoint:p];
NSPoint p1 = [v pointValue];
NSLog(@"p1.x = %f,p1.y = %f",p1.x,p1.y);
NSSize s = NSMakeSize(1, 2);
NSValue *v1 = [NSValue valueWithSize:s];
NSSize s1 = [v1 sizeValue];
NSLog(@"v1.width = %f, v1.height = %f",s1.width,s1.height);
NSRect r = NSMakeRect(1, 2, 3, 4);
NSValue *v2 = [NSValue valueWithRect:r];
NSRect r1 = [v2 rectValue];
NSLog(@"r1.x = %f,r1.y = %f,r1.width = %f,r1.height = %f",r1.origin.x,r1.origin.y,r1.size.width,r1.size.height);
return 0;
}
15、NSDate:是OC的日期处理类,它主要用于日期时间提取计算等常规的时间处理。 默认使用date方法生成的时间点为格林尼治标准时间。计算机内部的默认时间是从1970年1月1日开始的。
16、一些基本概念
深拷贝:深拷贝就是新建一个对象和新开辟一块内存。
浅拷贝:浅拷贝就是新建一个对象,但是都指向同一块内存地址。
原子性:就是写入文件时,会先产生一个临时文件用来保存存入的数据,当全部存入了临时文件时,再临时文件的内容拷贝到目标文件中去。