1,Cocoa是由两个不同的框架组成的:Foundation Kit和Application Kit。后者包含了所有的用户接口对象和高级类。
Cocoa Foundation框架中包含了很多有用的,面向数据的低级类和数据类型。
2,一些有用的数据类型
typedef struct _NSRange{
unsigned int location;
unsigned int length;
}NSRange;
这个结构体用来表示相关的事物的范围,通常是字符串里的字符范围或者数组里的元素范围。location字段存放该范围的起始位置,而length字段则是该范围内所含元素的个数。
创建新的NSRange的方式,
1,NSRange range; range.location = 17; range.length = 4; 2,NSRange range = {17, 4};//c语言的聚合结构赋值机制 3,Cocoa提供的一个快捷函数NSMakeRange(); NSRange range = NSMakeRange(17, 4);
几何数据类型,NSPoint和NSSize,NSRect等。
为什么这些数据类型是C的struct而不是对象呢?原因归结起来就是因为性能。程序(尤其是GUI程序)会用到许多临时的点,大小和就矩形来完成他们的工作。所有的Objective-C对象都是动态分配的,而动态分配是一个代价较高的操作,它会消耗大量的时间。所以将这些结构创建成第一等级的对象都会在使用过程中增加大量的系统开销。
3,字符串
创建字符串可以直接赋值 @“hi”;
NSString有个类方法stringWithFormat,
+ (id) stringWithFormat : (NSString *) format, ...;
(...)省略号告诉我们这个方法可以接收多个以逗号隔开的其他参数。
+代表类方法。创建新对象的类方法成为工厂方法,stringWithFormat就是一个工厂方法。
NSString *height = [NSString stringWithFormat: A"Your height is %d feet, %d inches", 5, 11];
字符串长度 [height length];调用length方法。
是否包含某个字符串,-(NSRange) rangeOfString: (NSString *) aString;
-(BOOL) hasPrefix: (NSString *) aString;//以一个字符串开头,
-(BOOL) hasSuffix: (NSString *) aString;//以一个字符串结尾,
NSString有个子类,叫NSMutableString,(java中的String和StringBuffer类似),如果想改变字符串,就用子类。
你可以使用类方法:stringWithCapacity来创建一个新的NSMutableString,声明如下:
+ (id) stringWithCapacity: (unsigned) capacity:
capacity容量是个NSMutableString的一个建议。字符串的大小并不仅限于所提供的容量,这个容量仅是个最优值,NSMutableString可以预分配一块内存来存储它,这样后续操作速度回快很多。
可按如下方法声明一个新的可变字符串:
NSString *str1;
Str1 = [NSMutableString stringWithCapacity:42];
可以使用appendString或appendFormat来对可变字符串操作:
- (void)appendString: (Nsstring *) aString;
- (void) appendFormat: (NSString *) Format;
appendString 接受参数aString,然后将其复制到接受对象的末尾。
appendFormat类似,他将格式化的字符串附加在接受对象的末尾,而不是创建新的对象。
你还可以使用deleteCharactersInRange:方法来删除字符串中的字符:
- (void) deleteCharactersInRange: (NSRange) range;
通常将deleteCharactersInRange: 和rangeOfString:连在一起使用,NSMutableString可以使用NSString的全部功能,包括rangeOfString:、字符串比较和其他任何功能。
4,NSArray
NSArray是一个Cocoa类,用来存储对象的有序列表。你可以在NSArray中放入人员类型的对象。
NSArray有两个限制。首先它只能存储Objective-C的对象,而不能存储C语言的基本类型数据,如int,float,enum,struct,或者NSArray中的随机指针。同时也不能存储nil。
(1)类方法arrayWithObjects ,创建一个新的NSArray: NSArray *array; array = [ NSArray arrayWithObjects : @"one", @"two", @"three", nil ]; //以逗号分割的对象列表,列表末尾添加nil代表列表结束, (2)-(unsigned) count 获得数组所包含的对象个数 和 -(id) objectAtIndex : (unsigned int ) index 获得特定引索处的对象 int i ; for ( i = 0; i < [ array count ]; i++){ NSLog (@"index %d has %@ ,", i , [ array objectAtIndex : i ] ); }//输出index 0 has one, index 1 has two, index 2 has three,在引索越界会报错!
和可变字符串差不多,NSMutableArray 是一个可变数组
(1)+(id) arrayWithCapacity : (unsigned) numitems,创建新的可变数组: NSMutableArray *array; array = [ NSMutableArray arrayWithCapacity : 17 ;] (2)-(void) addObject : (id) anObject在数组末尾添加对象; (3)-(void) removeObectAtIndex : (unsigned) index,可以通过它删除特定引索处的对象: [ array removeObjectAtIndex : 1 ];//值得注意的删除了这个特定引索的对象时,数组中并没有留下漏洞,被删除对象后面的数组元素都被前移来填补空缺了。
5,枚举器
NSEnumerator,它是Cocoa用来描述这种集合迭代运算的方式。数组可以通过objectEnumerator向数组请求枚举器。
遍历数组的三种方式:
(1)-(NSEnumerator *) objectEnumerator 通过它可以向数组请求枚举器: NSEnumerator *enumerator; enumerator = [array objectEnumerator]; //如果想从后向前浏览集合,还有一个方法reverseObjectEnumerator可以使用 (2)-(id) nextObject: 向枚举器请求它的下一个对象: NSEnumerator *enumerator; enumerator = [array objectEnumerator]; id thingie; while (thingie = [enumerator nextObject]){ NSLog (@" I found %@" , thingie); }//需要注意的是,对可变数组进行枚举操作时,有一点需要注意,你不能通过添加或删除对象这类方式来改变数组容器。 (3)快速枚举: for (NSString *string in array){ NSLog (@"I found %@ ", string); }//这个循环体将会遍历数组的每个元素,并用变量string存储每个数组值,它比枚举器语法更为简洁。
6,NSDictionary字典,给定一个关键字下存储一个数值,然你可以通过这个关键字来查找相应的数值。类似Map,HashMap。这种方式查询起来速度最快
(1)+( id )dictionaryWithObjectAndKeys: ( id )firstObject , .......; 该方法接受对象和关键字交替存储的系列,以nil值作为终止符号。 创建存储轮胎的字典例子: NSDictionary *tires; [ tires setObject : t1 forKey : @"front-left"]; [ tires setObject : t2 forKey : @"front-right"]; [ tires setObject : t3 forKey : @"back-left"]; [ tires setObject : t4 forKey : @"back-right"];//如果对字典中已有的关键字使用setObject :forKey:,那么这个方法将会用新值替换原有数值. (2)-(id)objectForKey : (id) aKey;通过键值获取字典中对应的值 Tire *tire = [ tires objectForKey : @"back-right" ]; (3)+(id)dictionaryWithCapacity : (unsigned int) numitems;创建可变字典 NSMutableDictionary (4)-(void)removeObjectForKey : (id)aKey;通过键值删除对应值 [ tires removeObjectForKey : @"back-left"];
7,在使用NSString,NSArray,NSDictionary的时候,注意不要试图去创建它们的子类。
8,NSNumber,
Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。像java中的Interger,Float,Boolean等
(1)+(NSNumber *)numberWithChar : (char)value; (2)+(NSNumber *)numberWithInt : (int)value; (3)+(NSNumber *)numberWithFloat : (float)value; (4)+(NSNumber *)numberWithBool : (BOOL)value;//除了这些还有很多,这些是比较常用的,通过创建NSNumber后,可以把它放 入一个字典和数组中 NSNumber *number; number = [ NSNumber numberWith : 42]; [ array addObject : number ];//加进数组里 [ dictionary setObect : number forKey : @"Bork"];//加入字典里 通过以下方法可以重获得它: -(char) charValue; -(int) intValue; -(float) floatValue; -(BOOL)boolValue; -(NSString *)stringValue; 此外,可以用nuberWithFloat::创建的NSNumber可以用intValue来提取数值,NSNumber会对数据进行适当的转换。
9,NSValue
NSValue,它是NSNumber的父类,它可以包装任何值,可以用它来装结构体。
(1) +(NSValue *)valueWithBytes :(const void *)value objCType : (const char *)type; 创建新的NSValue,参数一时你想要包装的数值地址。 例子:NSRect rect = NSMakeRect(1,2,30,40); NSValue * value; value = [NSValue valueWithBytes :&rect objCType : @encode(NSRect)]; //@encode编译器指令可以接受数据的名称并为你生成合适的字符串 [ array addObject : value ]; (2)-(void)getValue : (void *) value;提取数值,例子: value = [array objectAtIndex : 0]; [ value getValue : &rect ];//传递的是要存储这个数值的变量地址 (3)Cocoa提供饿将常用的strcut类型数据转换成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 ];
集合中不能放nil值,在需要空的时候需要拿NSNull来包装一下,这个类只有一个方法
+(NSNull *) null;
参考:http://blog.csdn.net/yuzhiboyi/article/details/7706247#