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基础

OC基础 Foundation基础 NSDictionary

OC Foundation框架 日期与时间

OC系列foundation Kit基础-NSdictionary

OC 知识:Foundation 框架及相关类详尽总结

OC Foundation 集合简述