Foundation Kit
Cocoa由兩個不同的架構組成 Foundation Kit和Application Kit
Foundation架構中有很多諸如NSString,NSArray等低級類和資料類型
Objective-c代碼
- #import <Foundation/Foundation.h>
- int main(int argc, const char *argv[]){
- NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
- //insert code here...
- NSLog(@"Hello, World!");
- [pool drain];
- return 0;
- }
通過alloc建立并通過init初始化了一個池,在結尾處排空,這是Cocoa記憶體管理的預覽
一些有用的資料類型
範圍 NSRange
Objective-c代碼
- typedef struct _NSRange{
- unsigned int location;
- unsigned int length;
- }NSRange;
表示相關事物的範圍,如字元串中的字元範圍或數組中的元素範圍
建立一個新的NSRange有3種方式
Objective-c代碼
- //1
- NSRange range;
- range.location=17;
- range.length=4;
- //2
- NSRange range={17,4};
- //3
- NSRange range=NSMakeRange(17,4);
第三種方法的好處是可以在任何能夠使用函數的地方使用,比如當作參數
Objective-c代碼
- [anObject flarbulateWithRange: NSMakeRange(13,15)];
幾何資料類型 NSPoint,NSSize
Objective-c代碼
- typedef struct _NSPoint{
- float x;
- float y;
- }NSPoint;
- typedef struct _NSSize{
- float width;
- float height;
- }NSSize;
比如Cocoa提供了矩形資料類型
Objective-c代碼
- typedef struct _NSRect{
- NSPoint origin;
- NSSize size;
- }NSRect;
同樣提供了NSMakePoint(),NSMakeSize(),NSMakeRect()方法
将這些資料類型作為struct而不是對象的好處是性能更高
字元串 NSString
建立字元串
Objective-c代碼
- NSString *height;
- height=[NSString stringWithFormat: @"Your height is %d feet",5];
類方法
我們所建立的大部分方法是執行個體方法 用前導減号 - 聲明
如果方法用于實作正常功能,用前導加好 + 來聲明類方法
就如NSString的stringWithFormat方法
Objective-c代碼
- + (id) stringWithFormat: (NSString *) format, ...;
關于大小
Objective-c代碼
- - (unsigned int) length;
使用方式
Objective-c代碼
- unsigned int length=[height length];
該方法可以正确處理國際字元串
比較
Objective-c代碼
- isEqualToString
- - (BOOL) isEqualToString: (NSString *) aString;
使用方式
Objective-c代碼
- NSString *[email protected]"hello 5";
- NSString *thing2;
- thing2=[NSString stringWithFormat: @"hello %d",5];
- if(thing1 isEqualToString: thing2]){
- NSLog(@"They are the same!");
- }
同樣的compare方法
Objective-c代碼
- - (NSCompar isonResult) compare: (NSString *) string;
傳回一個NSComparisonResult枚舉類型
Objective-c代碼
- type enum _NSComparisonResult{
- NSOrderedAscending=-1,
- NSOrderedSame,
- NSOrderedDescending
- }NSComparisonResult;
如果傳回NSOrderedAscending 表示左側小于右側 其他類似
不區分大小寫的比較
Objective-c代碼
- - (NSComparisonResult) compare: (NSString *) string
- options: (unsigned) mask;
options參數是一個掩碼
NSCaseInsensitiveSearch 不區分大小寫
NSLiteralSearch 完全比較,區分大小寫
NSNumericSearch 比較字元個數而不是字元值 比如100應該排在99以後
Objective-c代碼
- if([thing1 compare: thing2
- options: NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame){
- NSLog(@"They match");
- }
判斷字元串内是否包含其他字元串
Objective-c代碼
- - (BOOL) hasPrefix: (NSString *) aString;
- - (BOOL) hasSuffix: (NSString *) aString;
分别檢查以特定字元串開頭和結尾
Objective-c代碼
- - (NSRange) rangeOfString: (NSString *) aString;
傳回比對的位置,如果找不到 則range.start=NSNotFound
可變性
NSString是不可變的
NSMutableString是可變字元串
兩者間比較類似Java中的String和StringBuffer
建立NSMutableString的方法
Objective-c代碼
- + (id) stringWithCapacity: (unsigned) capacity;
該容量隻是一個建議
Objective-c代碼
- NSMutableString *string;
- string = [NSMutableString stringWithCapacity: 42];
可以使用一些方法操作該string
Objective-c代碼
- - (void) appendString: (NSString *) aString;
- - (void) appendFormat: (NSString *) format, ...;
使用起來非常友善 也很顯而易見
Objective-c代碼
- NSMutableString *string;
- string=[NSMutableString stringWithCapacity: 50];
- [string appendString: @"Hello here"];
- [string appendFormat: @"human %d!",39];
- //得到最後結果Hello here human 39!
類似的
删除字元串中的字元
Objective-c代碼
- - (void) deleteCharactersInRange: (NSRange) range;
NSMutableString是NSString的子類,是以可以使用NSString的所有功能
是以同樣可以使用stringWithFormat來建立NSMutableString
集合家族 NSArray NSDictionary等
NSArray可以放入任意類型的對象
兩個限制:
1 隻能存儲Objective-C對象,而不能是C基礎類型int,float,enum,struct等
2 不能存儲零值nil NULL值
可以通過類方法arrayWithObjects建立,以逗号分割對象清單,并最後以nil表示清單結束
Ojbective-c代碼
- NSArray *array;
- array=[NSArray arrayWithObjects: @"one",@"two",@"three",nil];
獲得對象個數
Objective-c代碼
- - (unsigned) count;
取得特定索引處對象
Objective-c代碼
- - (id) objectAtIndex: (unsigned int) index;
例如周遊一個數組
Objective-c代碼
- int i;
- for(i=0;i<[array count];i++){
- NSLog(@"index %d has %@",i,[array objectAtIndex: i]);
- }
将字元串切分成數組
Objective-c代碼
- -componentsSeparatedByString
将數組合并成字元串
Objective-c代碼
- -componentsJoinedByString
可變數組
NSArray是不可變的,類似的NSMutableArray可變
建立新的可變數組
Objective-c代碼
- + (id) arrayWithCapacity: (unsigned) numItems;
在數組末尾添加對象
Objective-c代碼
- - (void) addObject: (id) anObject;
删除特定位置對象
Objective-c代碼
- - (void) removeObjectAtIndex: (unsigned) index;
枚舉 NSEnumerator
通過objectEnumerator向數組請求枚舉器
Objective-c代碼
- - (NSEnumerator *) objectEnumerator;
這似乎類似于Java的疊代器Iterator
使用
Objective-c代碼
- NSEnumerator *enumerator;
- enumerator=[array objectEnumerator];
可以從後向前浏覽集合 reverseObjectEnumerator
請求下一個對象
Objective-c代碼
- - (id) nextObject;
當傳回nil時表示結束
快速枚舉
Objective-c代碼
- for(NSString *string in array){
- NSLog(@"I found %@",string);
- }
NSDictionary 有些類似于Map(散清單,關聯數組)
類似的NSDictionary不可變,可變的NSMutableDictionary
建立字典的方法
Objective-c代碼
- + (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;
例如
Objective-c代碼
- Tire *t1=[Tire new];
- Tire *t2=[Tire new];
- Tire *t3=[Tire new];
- Tire *t4=[Tire new];
- NSDictionary *tires;
- tires=[NSDictionary dictionaryWithObjectsAndKeys: t1, @"front=left", t2, @"front-right", t3, @"back-left", t4, @"back-right", nil];
使用objectForKey來擷取值
Objective-c代碼
- - (id) objectForKey: (id) aKey;
例如查找右後輪胎
Objective-c代碼
- Tire *tire=[tires objectForKey: @"back-right"];
同樣的,對于可變的字典
Objective-c代碼
- + (id) dictionaryWithCapacity: (unsigned int) numItems;
為可變字典添加元素
Objective-c代碼
- - (void) setObject: (id) anObject forKey: (id) aKey;
如果目前已有值,則新值會替代原有的值
删除值
Objective-c代碼
- - (void) removeObjectForKey: (id) aKey;
使用但不擴充
不要自己去建立NSString,NSArray,NSDictionary的子類
各種數值
就和Java中對int,float等有Integer,Float等對象封裝,Objectvie-C也提供了NSNumber的包裝類
Objective-c代碼
- + (NSNumber *) numberWithChar: (char) value;
- + (NSNumber *) numberWithInt: (int) value;
- + (NSNumber *) numberWithFloat: (float) value;
- + (NSNumber *) numberWithBool: (BOOL) value;
類似的還有long,long long等
例如将一個包裝後的資料放入數組
Objective-c代碼
- NSNumber *number;
- number=[NSNumber numberWithInt: 42];
- [array addObject: number];
- [dictionary setObject: num forKey: @"Bork"];
從包裝類擷取值
Objective-c代碼
- - (char) charValue;
- - (int) intValue;
- - (NSString *) stringValue;
等
NSValue
NSNumber是NSValue的子類,NSValue可以包裝任意值
Objective-c代碼
- + (NSValue *) valuseWithBytes: (const void *) value
- objCType: (const char *) type;
例如,将NSRect放入NSArray
Objective-c代碼
- NSRect rect=NSMakeRect(1,2,3,4);
- NSValue *value;
- value=[NSValue valueWithBytes: &rect
- objCType: @encode(NSRect)];
- [array addObject: value];
這裡使用@encode編譯器指令,它可以接受資料類型的名稱并轉化為合适的字元串
使用getValue取值
Objective-c代碼
- - (void) getValue: (void *) value;
傳遞的是存儲該數值的變量位址
Objective-c代碼
- value=[array objectAtIndex: 0];
- [value getValue: &rect];
Cocoa提供了常用的将struct型資料轉換成NSValue的方法
Objective-c代碼
- + (NSValue *) valueWithPoint: (NSPoint) point;
- + (NSValue *) valueWithSize: (NSSize) size;
- + (NSValue *) valueWithRect: (NSRect) rect;
Objective-c代碼
- - (NSPoint) pointValue;
- - (NSSize) sizeValue;
- - (NSRect) rectValue;
例如,在NSArray中存儲和檢索NSRect
Objective-c代碼
- value=[NSValue valueWithRect: rect];
- [array addObject: value];
- ...
- NSRect anotherRect=[value rectValue];
NSNull
之前提到nil在NSArray和NSDictionary中有特殊的含義,是以不能把nil放入其中,如果要真的表示沒有,Objectvie-C提供了NSNull
使用[NSNull null]==來比較是否為空