ios Objective-C 8.0 Foundation
Cocoa是由许多个不同的框架组成的,其中最常用于桌面端的OS X 应用程序的是Foundation框架和ApplicationKit,它包含了用户的界面UI对象和高级类。
如果你打算开发ios平台上的应用程序,那么需要用到User Interface Kit(UIKit)框架。
1.稳固的Foundation
它是两类UI框架的基础,因为不包含UI对象,所以它的对象可以在ios和OS X应用程序中兼容。是以CoreFoundation为基础创建的,CoreFoundation是纯C语言写的。
Foundation中有很对面向数据的简单类和数据类型:NSString、NSArray,NSEnumerator、NSNumber,大慨有100多个类。
2.有用的数据类型
Cocoa提供的结构体struct
名称 | 结构体 | 描述 | 快捷函数 |
---|---|---|---|
范围 | NSRange | 表示相关事物的范围,字符串里的字符范围和数组里的元素范围 | NSMakeRange() |
几何数据类型 | CGPoint | 表示笛卡尔平面中的一个坐标(x,y),由Core Graphics框架提供,以CG开头 | CGPointMake() |
几何数据类型 | CGSize | 存储长度和宽度 | CGSizeMake() |
矩形数据类型 | CGRect | 表示矩形的struct来表示形状 | CGRectMake() |
用结构体的原因,是为了保证性能
使用示例:
//三种创建方式
NSRange range; //直接给字段赋值
range.location = 17;
range.length = 4;
NSRange range = {17,4} //C语言聚合结构赋值机制
NSRange range = NSMakeRange(17,4) //Cocoa提供的快捷函数NSMakeRange()
[anObject flarbulateWithRange:NSMakeRange(17,4)] //使用NSMakeRange的好处,可以在调用方法的时候作为参数传递
3.字符串NSString
不是结构体,而是一个真正的类。是不可变的immutable:即不可以添加或者删除字符,但是可以进行比较,或是赋值给别的变量
创建字符串
NSString *height;
height = [NSString stringWithFormate:@"your height is %d feet , %d inches",5,11];
//结果:"your height is 5 feet , 11 inches"
//stringWithFormate 是一个类方法,工厂方法
思考:
1.什么是类方法和工厂方法,类方法的修饰符是什么?
2.类方法的作用与好处?
3.类方法是否可以访问全局数据?
4.什么是实例方法,修饰符是什么?
AppKit中的NSColor和UIKit中的UIColor类都拥有一个中颜色命名的类方法:
redColor\blueColor
NSColor *haveTheBlues = [NSColor blueColor]
UIColor *blueMan = [UIColor blueColor]
关于字符串大小
NSUInteger length = [height length];
if([height length] > 35){
NSLog(@"wow,you're really tall !");
}
字符串比较
方法名 | 返回值 | 描述 |
---|---|---|
isEqualToString | BOOL | 比较两个字符串的内容是否相同 |
compare | enum (NSComparisonResult) | 比较两个字符串在字母表中的位置,区分大小写的比较 |
hasPrefix | BOOL | 字符串以什么开始 |
hasSuffix | BOOL | 字符串以什么结尾 |
rangeOfString | NSRange | 字符串中是否包含子字符串 |
NSString *str1 = @"hello 5";
NSString *str2 = [NSString stringWithFormat:@"hello %d",5];
if([str1 isEqualToString: str2]){
NSLog(@"They are the same !");
}
有待补充
4.可变的字符串NSMutableString
创建NSMutableString,使用stringWithCapacity方法,NSMutableString是NSString的子类。
方法名 | 描述 |
---|---|
appenString | 添加字符串到末尾 |
appendFormat | 将格式化的字符串添加的末尾 |
deleteCharactersInRange | 删除字符串中的字符 |
//有待补充
5.集合这大家族
名称 | 描述 | 备注 |
---|---|---|
NSArray | 存储对象的有序列表 | 1.只能存储OC的对象,不能存储原始的C语言基础数据类型:int、float、enum、struct。 2.不能存储nil(对象的0值和null值) |
NSMutableArray | 可变数组类 | 弥补NSArray的不足,可以添加和删除数组中的对象 |
NSDictionary |
5.1关于NSArray
创建NSArray,使用arrayWithObjects方法。NSArray是不可变对象的数组,不能删除和添加对象,但是可以修改对象的值。count方法返回集合的对象个数、objectAtIndex返回特定索引处的对象。
NSArray *array = [NSArray arrayWithObjects:@“one”,@"two",@"three",nil]; //NSString 组成的含有3个元素的数组
NSString *array2 = @[@"one",@"two",@"three"]
//array和array2的内容一样
//使用字面量语法时不用再结尾处特意补上nil
NSArray的方法
名称 | 描述 | 返回值 |
---|---|---|
count | 包含对象的个数 | NSUInteger |
objectAtIndex:index(NSUInteger) | 特定索引处的对象 | id |
componentsSeparatedByString | 切割字符串为Array | NSArray |
componentsJoinedByString | 合并Array的内容为一个String | String |
//1.类C语言语法
id *myObject = array[1];
//2.objectAtIndex方法
for(NSInteger i = 0;i<[array count];i++){
NSLog(@"index %d has %@." ,i,[array objectAtIndex:i]);
}
//数组字面量语法
for(NSInteger i = 0;i<[array count];i++){
NSLog(@"index %d has %@." ,i,array[i]);
}
NSString *str = @"un:oop:fs:ns";
NSArray *chunks = [string componentSeparatedByString:@":"];
//chunks = ["un","oop","fs","ns"]
NSString string = [chunks componentsJoinedByString:@"?"]
//string = "un?oop?fs?ns"
5.2关于NSMutableArray
可变数组,弥补了NSArray的不足,使用arrayWithCapacity来创建数组,没有使用字面量创建的语法。
方法:
名称 | 描述 |
---|---|
addObject | 在数组末尾添加数组对象 |
removeObjectAtIndex | 删除特定索引处的对象 |
NSMutableArray *array = [NSMutableArray arrayWithCapacity:17];
Car car = [Car new]
[array addObject:car] //添加一辆车
[array removeObjectAtIndex:2] //删除第3个车
5.3枚举
NSArray经常要对数组中的每个元素执行相同的操作,Cocoa可以用NSEnumerator来表示集合中迭代出的对象。要使用NSEnumerator需要通过objectEnumerator向数组请求枚举器,nextObject获取下一个元素,如果返回nil则表示结束了。
NSEnumerator *enumerator = [array objectEnumertor];
while(id thingie = [enumerator nextObject]){
NSLog(@"i found %@",thingie);
}
5.4快速枚举
OC语言升级到2.0 就有优化后的快速枚举。
for(NSString *string in array){
NSLog(@"I found %@",string);
}
由于只有2.0才有这个功能,所以苹果公司添加了一个能在NSArray中通过代码块 枚举对象的方法,但是代码块只在Apple LLVM编译器上才会有效。
[array enumerateObjectsUsingBlock:^(NSString *string,NSUInteger idnex,BOOL *shop){
NSLog(@"I found %@",string);
}];
这里有4中遍历数组的方式:index,枚举器,快速枚举,代码块;
5.5NSDictionary字典
字典是关键字及其定义的集合。又称为散列表和关联数组。使用键值查询,对于频繁的查询和大型的数据来说,用字典比数组要快得多。
NSDictionary 是不可变字典。
创建方式:
- 字典字面量语法
- dictionaryWithObjectsAndKeys
Tire *t1 = [Tire new];
Tire *t2 = [Tire new];
Tire *t3 = [Tire new];
Tire *t4 = [Tire new];
//dictionaryWithObjectsAndKeys 创建
NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:t1,@"front-left",t2,@"font-right",t3,@"back-left",t4,@"back-right",nil]
//字面量创建
NSDictionary *tires = @{@"font-left":t1,@"font-right":t2,@"back-left":t3,@"back-right":t4}
方法:
名称 | 描述 |
---|---|
objectForKey | 传递前面用来存储的关键字,访问字典中的值 |
Tire *tire = [tires objectForKey:@"back-right"];
Tire *tire =tire[@"back-left"] //如果没有back-left则返回nil
NSMutableDictionary 可变字典
可以添加或是删除字典中的对象。
创建方式:
- dictionaryWithCapacity
- setObject:forKey //添加对象,替换对象
- 无字面量语法
NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:17]; //17只是作为字典大小的参考值,实际对象个数是可以超过17的
//像NSMutableDictionary发送dictionary消息,便可以创建新的可变字典NSMutableDictionary对象
NSMutableDictionary *tires = [NSMutableDictionary dictionary];
[tires setObject:t1 forkey:@"font-left"];
[tires setObject:t2 forkey:@"font-right"];
[tires setObject:t3 forkey:@"back-left"];
[tires setObject:t4 forkey:@"back-right"];
[tires removeObjectForKey:@"back-left"] //removeObjectForKey删除对象
注意:
NSArray 和NSDictionary只能存储对象,不能直接存储任何基本类型的数据。
6.NSNumber类
NSNumber类来封装基本数据类型。
创建方式:
- 字面量语法
- numberWithChar
- numberWithInt
- numberWithFloat
- numberWithBool
- .....等
将基本类型数据封装到NSNumber中后,可以通过下面的实例方法来重新获得。
- charValue
- intValue
- floatValue
- boolValue
- stringValue
NSNumber *number;
number = @'X';//字符型
number = @12345 ;//整型
number = @12345ul ;//无符号长整型
number = @12345ll;//long long
number = @123.45f;//浮点型
number = @123.45;//双浮点型
number = @YES; //布尔值
NSNumber *number2 = @42;
[array addObject number];
[dictionary setObject:number forKey:@"Bork"];
NSString str = [number2 stringValue];
6.2 NSValue
NSNumber 实际上NSValue的子类,NSValue可以封装任意值。
创建方式:
- valueWithBytes:value objCType:type
eg:将NSRect放入NSArray中
NSRect rect = NSMakeRect(1,2,20,40);
NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[array addObject:value];
//使用getValue来提取数值,参数传递变量的地址用&符号
value = [array objectAtIndex:0];
[value getValue:&rect];
cocoa提供了将struct型数据转换为NSValue的便捷方法
- valueWithPoint
- valueWithSize
- valueWithRect
- pointValue
- sizeValue
- rectValue
value = [NSValue valueWithRect:rect];
[array addObject:value];
....
NSRect anotherRect = [value rectValue];
6.3 NSNull
在Array和dictionary中不能存储nil因为nil在这里面有特殊的含义,所以当你实在是需要在Array中存储空值时,使用NSNull便可以。NSNull可能是cocoa中最简单的类了,他只有一个方法null;
//添加null到集合
[contact setObject:[NSNull null] forKey:@"home fax machine"];
//访问他的方式
id homefax = [contact objectForKey:@"home fax machine"];
if(homefax == [NSNull null]){
........
}
7.实战查找文件,遍历文件
后续实现....