8.1 稳固的Foundation
1、Foundation是两类UI框架的基础,因为它不含UI对象,所以它的对象可以在iOS或OS X应用程序中兼容
2、Foudation框架中有许多有用的、面向数据的简单类和数据类型(如NSString、NSArray、NSEnumerator和NSNumber等)
3、Foundation是以另一个框架CoreFoundation(用纯C语言写的,函数或变量以CF开头)为基础创建的
8.2 使用项目样本代码
@autorreleasepool
8.3 一些有用的数据类型
Cocoa的一些结构体(struct)
8.3.1 范围:NSRange
8.3.2 几何数据类型
用来处理几何图形的数据类型,这些类型由Core Graphics框架提供,名称都带有CG前缀,如(CGPoint和CGSize)
8.4 字符串
8.4.1 创建字符串
1
NSString *height=@”175mm”;
2
+(id)stringithFormat:(NSString *)format,…;//…告诉编译器这个方法可以接受多个以逗号隔开的其他参数,+表示把这个方法定义为类方法(class method)
NSString *height=[NSString stringWithFormat:@”your height is %d”,175];
8.4.2 类方法
1、方法(前缀+),术语类对象。通常用于创建新的实例或者访问一些全局类数据
2、实例方法(前缀-),将会在指定的对象实例中起作用
8.4.3 关于大小
-NSUInter length;
NSUInter length=[height length];//实例方法length返回字符串中的字符个数
8.4.4 字符串比较
1
-(BOOL)isEqualToString:(NSString *)aString;
if([thing1 isEqualToString:thing2]){
NSLog(@”YES”);
}
2
-(NSComparisonResult)compare:(NSString *)aString;
返回NSOrderedAscending,左边的数值小于右边的,即比较的目标在字母表的位置更靠前,返回NSOrderedAscending,则靠后,返回NSOrderedSame,则相同。
8.4.5 不区分大小写的比较
使用option
-(NSComparisonResult)compare:(NSString *)aString option:(NSStringCompareOptions)mask;
options参数是一个掩位码,使用|来添加选项标记
if([thing1 compare:thing2 options:NSCaseInsensitiveSearch|NSNumericSearch]==NSOrderedSame){
NSLog(@”YES”);
}
NSCaseInsensitiveSearch:不区分大小写
NSNumericSearch:比较字符串的字符个数,而不是字符串值
NSLiteralSearch:完全比较,区分大小写
8.4.6 字符串内是否孩包含别的字符串
-(BOOL)hasPrefix:(NSString *)aString;//检查字符串是否以另一个字符串开头
-(BOOL)hasSuffix:(NSString *)aString;//检查是否以另一个字符串结尾
-(NSRange)rangeOfString:(NSString *)aString;//检查字符串中是否包含其他字符串
if([filename hasSufffix:@”.txt”]){
NSLog(@”This is a .txt”);
}
NSRange range=[filename rangeOfString:@”txt”];//返回NSRange结构体,包括location和length
8.4.7可变性
NSString是不可变的,一旦创建,无法通过删除或者添加字符的形式来改变它.
NSMutableString可变字符串
1、创建一个NSMutableString
+(id)NSMutableString:(NSUInter *)capacity;// 声明
NSMutableString *string=[NSMutableString stringWithCapacity:42];// 创建一个新的可变字符串
[string appendString:@”hello”];//添加字符串
[string appendFormat:@”hello,%@”,sds];//添加字符串
//删除字符串中的字符
NSRange sdsRange=[string rangeOfString:@”sds”];
sdsRange.length–;//删除sds前的逗号
[string deleteCharactersInRange:sds];
2、两个特性
NSMutableString是NSString的子类,因此获得了两个特性
1、 任何使用NSString的地方,都可以使用NSMutableString代替
2、 与实例方法一样,继承对类方法也同样适用,NSMutableString也可以使用NSString的方法(如,stringWithFormat)
8.5 集合大家族
8.5.1 NSArray:Cocoa类,用来存储对象的有序列表
1)NSArray的两个限制:
1、 只能存储Objective-C的对象,不能存储院士的C语言基础数据类型(如int、flaot以及NSArray中的随机指针等)
2、 不能存储nil
2)创建方式:
1、通过类方法arrayWithObjects:创建NSArray
NSArray *array=[NSArray arrayWithObjects:@”one”,@”two”,nil];//对象列表以逗号分割,以nil结尾
2、使用数组字面量格式
NSArray *array=@[@”one”,@”two”];
3)获取数组包含对象个数:[array count];
4)获取特定索引处的对象:[array objectAtIndex:i]或者array[i]
5)设置断点,使程序遇到异常时抛出。(左侧工作栏第七个按钮,点+号添加)
6)将字符串切分成数组
NSString *string=@”s,d,s”;
NSArray *array=[string componentsSeparatedByString @”,”];//分割
string=[array componentsJoinedBYString:@”;”];//合并
8.5.2 可变数组(NSMutableArray)
NSMutableArray *array=[NSMutableArray arrayWithCapacity:42];// 创建一个新的可变数组
[array addObject:Object];//添加对象
[array removeObjectAtIndex:0];//删除索引处的对象
8.5.3 枚举
NSEnumerator *enumerator=[array objectEnumerator];
//通过 objectEnumerator方法向array请求枚举器
while(id thingie=[enumerator nextObject])//使用nextObject方法,每次循环都想这个枚举器请求下一个对象,直到nil
{
NSLog(@”I found %@”,thingie);
}
注意:对可变数组进行枚举操作时,如果通过添加或者删除对象来改变数组容量,枚举器会出现混乱,会获得undefined result。
8.5.4 快速枚举(推荐使用)
for(NSString *string in array){
NSLog(@”I found %@”,string);
}
8.5.5 NSDictionary
1、创建
Tire *t1=[Tire new];
Tire *t2=[Tire new];
NSDictionary *tires=[NSDictionary dictionaryWithObjecAndKeys:t1,@”front”,t2,@”back”];
也可以使用
NSDictionary *tires=@{@”fornt”:t1,@”back”:t2};
2、查找
Tire *tire=[tires objecForKey:@”front”];
或者
Tire *tire=tires[@”front”];
3、NSMutableDictionary
NSMutableDictionary *dictionary =
[NSMutableDictionary stringWithCapacity:42];// 创建一个新的
可变字典并告诉该字典建议的最终大小
或者直接向NSMutableDictionary发送dictionary消息,创建新的字典
NSMutableDictionary *dictionary =[NSMutableDictionary dictionary];
[dictionary setObject:t1 forKey:@”front”];//添加元素
[array removeObjectForKey:@”front”];//删除对象
注意:与NSArray一样,没有适用于NSMutableDictionary的字面量初始化语法
8.5.6 请不要乱来
不要轻易创建NSString、NSArray或NSDirctionary的子类(12章中具体介绍)。
8.6 其他数值
NSArray和NSDirctionary只能存储对象,不能直接存储基本类型数据。但可以先用对象来封装基本数值
8.6.1 NSNumber(封装基本数据类型)
NSNumber *number=@1;//整数型
NSNumber *number=@”1”;//字符型
使用实例方法重新获得原有数据:
[number intValue];
8.6.2 NSValue(NSNumber的超类,可以封装任意值)
传递的参数时想要封装的数值的地址
将NSRect放入NSArray中
NSRect rect=NSMakeRect(1,2,3);
NSValue *value=[NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[array addObject:value];
可以使用方法getValue:来提取数值(需要传递存储这个数值的变量地址):
value=[array objectAtIndex:0];[value getValue:&rect];//方法名中使用了get,表明我们提供的是一个指针
8.6.3 NSNull
不能再集合中放入nil,nil在NSArray和NSDictionary中由特殊的含义
使用NSNull 可以表示“这里什么都没有”,它只有一个方法
[NSNull null]
8.8 小结
1)三个语言特性
1、类方法,由类本身而不是某个示例来处理的方法
2、@encode()指令,用于需要描述C语言基础类型的方法;
3、快速枚举
2)Cocoa类
1、NSString存储字符串
2、NSArray和NSDictionary存储对象的集合(一旦创建不能更改)
3、NSMutableArray和NSMutableDictionary(可更改)