OC Foundation Kit
Posted cjj-ggboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC Foundation Kit相关的知识,希望对你有一定的参考价值。
Cocoa由两个不同的框架组成:Foundation Kit和Application Kit。
Application Kit包含了所有的用户接口对象和高级类。
Foundation Kit有很多有用的、面向数据的低级类和数据类型。
一些有用的数据类型:
1、范围NSRange
typedef struct _NSRange{
unsigned int location;
unsigned int length;
}NSRange;
这个结构体用来表示相关事物的范围,通常是字符串里的字符范围或者数组里的元素范围。
location字段存放该范围的起始位置,而length字段是该范围内所含元素的个数。
可以用3种方式创建新的NSRange。
1)直接给字段赋值:
NSRange range;
range.location=17;
range.length=4;
2)使用C语言的聚合结构赋值机制,大括号列表初始化。
NSRange range={17,4};
3)使用Cocoa提供的一个快捷函数NSMakeRange()
NSRange range=NSMakeRange(17,4);
使用NSMakeRange()的好处是可以在任何能够使用函数的地方使用它。
location字段未被初始化时是NSNotFound,表示无意义范围。
2、几何数据类型
几种用来处理几何图形的数据类型,如NSPoint和NSSize。
NSPoint代表的是笛卡尔平面中的一个点:
typedef struct _NSPoint{
float x;
float y;
}NSPoint;
NSSize用来存储长度和宽度:
typedef struct _NSSize{
float width;
float height;
}NSSize;
NSRect矩形数据类型:
typedef struct _NSRect{
NSPoint origin;
NSSize size;
}NSRect;
Cocoa也提供了创建这些数据类型的快捷函数:NSMakePoint()、NSMakeSize()和NSMakeRect()。
3、字符串NSString
创建字符串:
NSString的stringWithFormat:方法就是这样通过格式字符串和参数来创建NSString的:
+ (id) stringWithFormat: (NSString *) format, ...;
NSString *height;
height=[NSString stringWithFormat: @"my height is %d", 150];
stringWithFormat: 的声明中有两个值得讨论的地方。第一个是定义最后的省略号(...),它告诉我们和编译器这个方法可以接收多个以逗号隔开的其它参数。
另一个重要的地方是stringWithFormat: 的开始字符:一个加号。
OC在运行时生成一个类的时候,它会创建一个代表该类的类对象。类对象包含了指向超类的指针、类名和指向类方法列表的指针。类对象还包含一个long型数据,为新创建的类实例对象指定大小(以字节为单位)。
如果在声明方法时添加了加号,那么就是把这个方法定义为类方法。这个方法属于类对象(而不是类的实例对象)并且通常用于创建新的实例。称这种用来创建新对象的类方法为工厂方法。
NSString中另一个方便的实例方法是length,它返回的是字符串中的字符个数。
- (unsigned int) length;
unsigned int len=[height length];
字符串的比较:
isEqualToString: 可以用来比较接收方(接收消息的对象)和当作参数传递来的字符串。isEqualToString: 返回一个BOOL(YES或NO)型数据来表示两个字符串的内容是否相同。
原型: - (BOOL) isEqualToString: (NSString *) aString;
使用:
NSString *thing1=@"hello";
NSString * thing2;
thing2=[NSString stringWithFormat: @"hello"]
if ([thing1 isEqualToString: thing2]){...} //if(thing1 == thing2)//这是对指针值进行比较
要比较两个字符串,可以使用compare:方法。
原型:- (NSComparisonResult) compare: (NSString *) string;
compare:将接收对象和传递来的字符串逐个字符进行比较,它返回一个NSComparisonResult(一个enum型数据)来显示比较结果。
typedef enum _NSComparisonResult{
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
}NSComparisonResult;
compare是进行大小写区分比较的。
还有一个方法compare: options: ,这个方法能给我们更多的控制权。
原型:- (NSComparisonResult) compare: (NSString *) string options: (unsigned) mask;
options参数是一个位掩码,可以使用位或运算符(|)来添加选项标记。
一些常用的选项如下:
1)NSCaseInsensitiveSearch:不区分大小写字符。
2)NSLiteralSearch:进行完全比较,区分大小写。
3)NSNumericSearch:比较字符串的字符个数,而不是字符串。
字符串内是否还包含别的字符串:
- (BOOL) hasPrefix: (NSString *) aString;
- (BOOL) hasSuffix: (NSString *) aString;
分别判断前缀后缀。
判断字符串中是否包含子串。
- (NSRange) rangeOfString: (NSString *) aString;
将rangeOfString传递给一个字符串时,参数是一个子串,返回值是这个子串在原字符串中的范围NSRange。如果不存在,则NSRange的location是NSNotFound。NSNotFound是-1。
4、可变性
NSString是不可变的,这并不意味着不能操作它们。不可变的意思是一旦NSString被创建了,我们就不能改变它。不能以删除字符或添加字符的方式来改变它。
Cocoa提供了一个NSString的子类,叫做NSMutableString。如果想改变字符串,可以使用这个子类。
可以使用类方法stringWithCapacity: 来创建一个新的NSMutableString,
+ (id) stringWithCapacity: (unsigned) capacity;
这个容量只是给NSMutableString的一个建议,字符串的大小并不仅限于提供的容量,这个容量仅是最优值。(类似C++的vector)。
NSMutableString *str;
str=[NSMutableString stringWithCapacity: 42] //
一旦有了一个可变字符串,就可以对它进行各种操作了。一种常见的操作是通过appendString:或appendFormat: 来附加新字符串。
- (void) appendString: (NSString *) aString;
- (void) appendFormat: (NSString *) bString, ...;
appendString接收参数aString将其添加到接收对象的末尾。appendFormat的工作方式与stringWithFormat: 类似,但它将格式化的字符串附加在接收字符串的末尾,而不是创建新的字符串对象。
可以用deleteCharactersInRange: 方法删除字符串中的字符。
- (void) deleteCharactersInRange: (NSRange) range;
可以将deleteCharactersInRange:和rangeOfString:连接在一起。
NSMutableString是NSString的子类,可以在NSMutableString中使用所有NSString的方法
任何使用NSString的地方都可以使用NSMutableString代替,任何接受NSString的方法也都会接受NSMutableString。
NSString中的类方法stringWithFormat也可以在NSMutableString中使用。
5、集合家族
Cocoa提供了许多集合类,如NSArray和NSDictionary,它们的实例就是为了存储其他对象而存在的。
NSArray
NSArray是一个Cocoa类,用来存储对象的有序列表,可以在NSArray中存放任意类型的对象。
只要有了一个NSArray,就可以通过各种方式来操作它,例如让某个对象的实例变量指向这个数组,将该数组当做参数传递给方法或函数,获取数组中所存放对象的个数,提取某个索引所对应的对象,查找数组中的对象,遍历数组,以及其它许多操作。
NSArray有两个限制,首先,它只能存储Objective-C对象,而不能存储C语言的基本数据类型。同时不能在NSArray中存储nil(对象的零值或NULL值)。有很多方法可以避开这些限制。
可以通过类方法arrayWithObjects: 创建一个新的NSArray。发送一个以逗号分隔的对象列表,在列表结尾添加nil代表列表结束(这也是不能在数组中存储nil的原因)。
NSArray *array;
array=[NSArray arrayWithObjects: @"one", @"two", @"three", nil];
通过数组的count方法获得它所包含的对象个数:
- (unsigned) count;
并且可以通过objectAtIndex: 获取特定索引处的对象:
- (id) objectAtIndex: (unsigned int) index;
如果索引大于数组中对象的个数,那么Cocoa在运行时会输出错误。
NSArray创建的是不可变对象的数组。一旦用特定数量的对象创建了一个数组,那么它就固定下来了;既不能添加元素也不能删除元素,不过数组中包含的对象是可改变的,但数组对象本身是不可变的。
NSMutableArray可变数组,可以随意添加和删除数组中的对象。NSMutableArray通过类方法arrayWithCapacity来创建新的可变数组。
+ (id) arrayWithCapacity: (unsigned) numItems;
数组容量是一个参考值。
使用addObject: 在可变数组末尾添加对象:
- (void) addObject: (id) anObject;
可以用removeObjectAtIndex: 来删除某个对象:
- (void) removeObjectAtIndex: (unsigned) index;
6、枚举
NSEnumerator,是Cocoa用来描述这种集合迭代运算的方式。
要想使用NSEnumerator,需通过objectEnumerator向数组请求枚举器:
- (NSEnumerator *) objectEnumerator;
例如:编写一个从0到[array count]的循环来读取每个索引处的对象。
NSEnumerator *enumerator;
enumerator=[array objectEnumerator];
如果想要从后向前浏览集合,还有一个方法reverseObjectEnumerator可以使用。
在获得枚举器之后,可以开始一个while循环,每次循环都向这个枚举器请求它的nextObject下一个对象:
- (id) nextObject;
nextObject返回nil时循环结束。
id thing;
while(thing = [enumerator nextObject]){ //将数组中的某对象赋给thing变量
....
}
对可变数组进行枚举操作时,有一点需要注意:不能通过添加或删除对象这类方式来改变数组容器。可能会导致未定义结果。
快速枚举(类似C++中的for(auto i:arr)这样的)
for(NSString *string in array){
NSLog...
}
7、NSDictionary
字典。NSDictionary在给定的关键字(通常是一个NSString字符串)下存储一个数值(可以是任意类型的对象)。然后就可以用这个关键字来查找相应的数值。
NSDictionary是不可变对象,NSMutableDictionary类允许随意添加和删除字典元素。
在创建新的NSDictionary时,就要提供该字典所存储的全部对象和关键字。
使用类方法dictionaryWithObjectsAndKeys: 来创建字典。
+ (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;
该方法接收对象和关键字交替存储的系列,以nil值作为终止符号。
NSDictionary *tires;
tires=[NSDictionary dictionaryWithObjectsAndKeys: t1,@"front left",t2,@"front right",...nil];
t1和t2是对象,它们之后的字符串是对象的键。
使用方法objectForKey: 来获取字典中的值,向方法传递之前用来存储该值的关键字。
- (id) objectForKey: (id) akey;
Tire *tire=[tires objectForKey:@"front left"];
如果字典中不存在该键,则objectForKey会返回nil。
要创建新的NSMutableDictionary对象,向类NSMutableDictionary发送dictionary消息。可以使用dictionaryWithCapacity: 方法来创建新的可变字典并且告诉Cocoa该字典的最终大小。
+ (id) dictionaryWithCapacity: (unsigned int) numItems;
这里的容量也是一个建议值。
可以使用setObject:forKey: 方法给字典添加元素:
- (void) setObject: (id) anObject forKey: (id) aKey;
NSMutableDictionary *tires;
tires=[NSMutableDictionary dictionary];
[tires setObject: t1 forKey: @"front-left"];
如果对字典中已有的关键字使用setObject: forKey: ,那么这个方法将会用新值替换原有数值。
如果想在可变字典中删除一个关键字,可以使用removeObjectForKey: 方法。
- (void) removeObjectForKey: (id) aKey;
8、NSNumber
NSNumber类包装基本数据类型,可以用下列类方法创建新的NSNumber对象:
+ (NSNumber *) numberWithChar: (char) value;
+ (NSNumber *) numberWithInt: (int) value;
+ (NSNumber *) numberWithFloat: (float) value;
+ (NSNumber *) numberWithBool: (BOOL) value;
还有许多种创建方法,无符号版本和种种long与long long型数据。
只要将一个基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获得它:
- (char) charValue;
- (int) intValue;
- (float) floatValue;
- (BOOL) boolValue;
- (NSString *) stringValue;
将创建方法和提取方法配对使用是完全可以的,用numberWithFloat: 创建的NSNumber可以用intValue来提取数值,NSNumber会对数据进行适当的转换。
9、NSValue
NSNumber实际上是NSValue的子类,NSValue可以包装任意值。可以用NSValue将结构放入NSArray和NSDictionary中。
可以使用类方法创建新的NSValue:
+ (NSValue *) valueWithBytes: (const void *) value objCType: (const char *) type;
传递的参数是你想要包装的数值的地址。得到的是你想要存储的变量的地址。
可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。不用自己写代码来生成这个字符串,@encode编译器指令可以接受数据类型的名称并为你生成合适的字符串。
NSRect rect=NSMakeRect(1,2,30,40);
NSValue *value;
value=[NSValue valueWithBytes: &rect objCType: @encode(NSRect)];
可以使用方法getValue: 来提取数值:
- (void) getValue: (void *) value;
调用getValue: 时,要传递的是要存储这个数值的变量的地址:
value=[array objectAtIndex: 0];
[value getValue: &rect];
Cocoa提供了将常用的struct型数据转换成NSValue的便捷方法,如下所示:
+ (NSValue *) valueWithPoint: (NSPoint) point;
+ (NSValue *) valueWithSize: (NSSize) size;
+ (NSValue *) valueWithRect: (NSRect) rect;
- (NSPoint) pointValue;
- (NSSize) sizeValue;
- (NSRect) rectValue;
可按下面的方式在NSArray中存储和检索NSRect:
value=[NSValue valueWithRect: rect];
[array addObject: value];
NSRect anotherRect=[value rectValue];
10、NSNull
前面提到,不能在集合中放入nil值,因为在NSArray和NSDictionary中nil有特殊含义。
但有时确实需要存储一个表示“这里什么都没有”的值。
NSNull大概是Cocoa中最简单的类了,它只有一个方法:
+ (NSNull *) null;
可以按照下面的方式将它添加到集合中:
[contact setObject: [NSNull null] forKey: @"home fax machine"];
访问它的方法如下:
id homefax;
homefax=[contact objectForKey: @"home fax machine"];
if(homefax==[NSNull null]){
//...
}
[NSNull null]总是返回一样的数值,所以可以使用运算符==将该值与其它值进行比较。
以上是关于OC Foundation Kit的主要内容,如果未能解决你的问题,请参考以下文章
OC基础 Foundation基础 NSDictionary