### 概述
Mac OS X開發會使用 Cocoa框架,
它是一種支持應用程序提供豐富用戶體驗的框架,?
它實際上由: Foundation和Application Kit(AppKit)和?Core Data框架組成。?
iOS開發, 會使用 Cocoa Touch框架,?
它實際上由: Foundation、Core Data和UIKit框架組成。?
AppKit和UIKit框架都是與窗口 、 按鈕、 列表等相關的類。
Foundation是Mac OS X和iOS應用程序開發的基礎框架,?
它包括了一些基本的類, 如: 數字、 字符串、 數組、 字典等。
快速概要:
光標放在需要搜索的類、方法或變量上,按住Option鍵,同時單擊鼠標,你會看到所選擇內容的快速概要。
在面板的右上角注意到有兩個圖標:第一個是一本書,第二個是一個字符h。
單擊那個書的圖標,Xcode會查找選擇的類、協議、定義或者方法的相關文檔。
單擊字符h的圖標,將會顯示包含選擇項目定義的頭文件。
MAC OS X在線參考庫,地址是[點擊打開鏈接](http://developer.apple.com/library/mac/navigation/index.html)。
要使用Foundation框架中的類,要先引用頭文件:
`#import `
實際上,因為Foundation.h文件導入Foundation所有的頭文件,所以不必擔心是否導入正確的頭文件。
但使用這條語句會明顯增加程序的編譯時間。
所以,一般import用到的頭文件。不要用太大的import。
基本數據類型:
int、 char、 float和double都不是類,?
不具有方法、 成員變量和屬性, 以及面向對象的特征。?
為了實現“一切都是對象” 的承諾,?
因此在Foundation框架中使用NSNumber類來封裝這些數字類型。?
這樣數字就具有了面向對象的基本特征了。
也就是說:如果需要存儲基本數據類型(包括char數據類型),可以使用NSNumber類,
它會依據這些數據的類型創建對象。
對于每種基本數據類型,類方法都能為它創建一個NSNumber對象,并設置為指定的值。
NSNumber類構造函數
采用 + numberWithInt: 等“+ number” 開頭的類級構造方法, 可以從基本數據類型構建NSNumber對象。?
而使用 –intValue方法可以從NSNumber對象獲得基本數據類型。?
這些方法以numberWith開頭,緊接著數據的類型,如:numberWithLong:
~~~
NSNumber?*intNumber=?[NSNumber?numberWithInteger:80];??
NSNumber?*floatNumber?=?[NSNumber?numberWithFloat:??
80.00];??
int?myint?=?[intNumber?intValue];??
float?myfloat?=?[floatNumber?floatValue];??
~~~
注意,方法numberWithInt:和numberWithInteger:使用有些差別,遵循以下一些規則:
1)如果使用numberWithInt:方法創建一個整型數,需要使用intValue獲取它的值,使用%i作為格式化字符串顯示它的值。
2)如果使用numberWithInteger:方法創建一個整型數,需要使用integerValue獲取它的值,也可以轉換成long顯示或使用stringWithFormat:將它格式化為字符串。使用%li作為格式化字符串。
比較兩個NSNumber對象大小
可以轉化成為基本數據類型比較, 當然可以使用 NSNumber的方法比較,?
這就是對象的優勢了, 與比較相關方法有:
isEqualToNumber: 和compare: 。?
isEqualToNumber: 只是比較是否相對, compare: 可以比較大小。
~~~
if?([intNumber?isEqualToNumber:?floatNumber]?==?YES)?{??
NSLog(@"相等");??
}?else?{??
NSLog(@"不相等");??
}??
if?([intNumber?compare:?myNumber]?==??
NSOrderedAscending)?{??
NSLog(@"第一個數小于第二個數");??
}??
~~~
NSOrderedAscending是枚舉類型NSComparisonResult的其中成員, 代表第一個數小于第二個數,?
此外還有NSOrderedSame成員代表第一個數等于第二個數,?
NSOrderedDescending成員代表第一個數大于第二個數。
### 字符串類
在Foundation框架中字符串類有兩種:?
NSString不可變字符串類和NSMutableString可變字符串類。?
NSString是定義固定大小的字符串,?
NSMutableString是可對字符串做追加、刪除、 修改、 插入和拼接等操作而不會產生新的對象。
### NSString類
NSSTring的類,用于處理字符串對象。然而C樣式的字符串由char字符組成,NSString對象由unichar字符組成。
要使用Objective-C語言創建一個常量字符串對象,需要在字符串開頭放置一個@字符。
創建字符串對象時,會創建一個內容不可更改的對象,這稱為不可變對象。
需要制定一個范圍確定子字符串,使用特殊的數據類型NSRange類創建對象。
實際上,它是結構的typedef定義,包含location和length兩個成員。
如果沒有找到這個字符串,則返回范圍的location成員被設置為NSNotFound。
stringWithString:類級構造方法創建NSString對象,NSString構造方法還有很多;
length,返回Unicode字符的長度;
stringByAppendingString:實現了字符串的拼接,這個方法會產生下一新的對象;
isEqualToString:比較兩個字符串是否相等;
compare: 比較兩個字符串大小;
substringToIndex:可以獲得字符串的前x個字符串;
substringFromIndex:可以截取x索引位置到尾部字符串;
rangeOfString:字符串查找;
下面來看一段示例代碼:
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??????
????NSString?*str1?=?@"aBcDeFgHiJk";??
????NSString?*str2?=?@"12345";??
????NSString?*res;??
????NSComparisonResult?compareResult;??
????NSRange?subRange;??
??????
????//字符個數??
????NSLog(@"字符串str1長度:?%i",[str1?length]);??
????//拷貝字符串到res??
????res?=?[NSString?stringWithString:?str1];??
????NSLog(@"拷貝:?%@",?res);??
????//拷貝字符串到str1尾部??
????str2?=?[str1?stringByAppendingString:?str2];??
????NSLog(@"連接字符串:?%@",?str2);??
??????
????//測試字符串相等??
????if?([str1?isEqualToString:?res]?==?YES)?{??
????????NSLog(@"str1?==?res");??
????}?else?{??
????????NSLog(@"str1?!=?res");??
????}??
????//測試字符串??==???
????compareResult?=?[str1?compare:?str2];??
????if?(compareResult?==?NSOrderedAscending)?{??
????????NSLog(@?"str1?);??
????}?else?if?(compareResult?==?NSOrderedSame)?{??
????????NSLog(@?"str1?==?str2");??
????}?else?{??
????????NSLog(@?"str1?>?str2");??
????}??
????res?=?[str1?uppercaseString];??
????NSLog(@"大寫字符串:%@",?res);??
????res?=?[str1?lowercaseString];??
????NSLog(@"小寫字符串:%@",?res);??
????NSLog(@"原始字符串:?%@",?str1);??
??????
????//獲得前三個數??
????res?=?[str1?substringToIndex:?3];??
????NSLog(@"字符串str1的前三個字符:?%@",res);??
????res?=?[str1?substringFromIndex:?4];??
????NSLog(@"截取字符串,從第索引4到尾部:?%@",res);??
??????
????res?=?[[str1?substringFromIndex:?3]?substringToIndex:?2];??
????NSLog(@"截取字符串,從第索引3到5:?%@",res);??
??????
????//字符串查找???
????subRange?=?[str2?rangeOfString:?@"34"];??
??????
????if?(subRange.location?==?NSNotFound)?{??
????????NSLog(@"字符串沒有找到");??
????}?else?{??
????????NSLog?(@"找到的字符串索引?%i?長度是?%i",???
???????????????subRange.location,?subRange.length);??
????}??
??????
??????
????[pool?drain];?????
????return?0;??
??????
}??
~~~
我們解釋一下主要代碼:
str2 = [str1?stringByAppendingString: str2] 語句是將兩個字符串對象拼接在一起,?
由于NSString是不可變字符串類, 這會產生一個新的對象。?
subRange = [str2 rangeOfString: @"34"] 中的rangeOfString: 方法會返回一個NSRange結構體,?
它的location成員是找到的字符串的索引 , 它的length成員是找到的字符串的長度。
NSMutableString 類
NSMutableString類可以用來創建可以更改字符的字符串對象。
注意,如果替換字符串中還包括搜索字符串(如:使用字符串“ax”替換字符串“a”),
那么將會陷入無限循環。
其實,這個是和它的實現原理有關系,一般這種替換使用的方法使用了遞歸調用。
stringWithString: 類級構造方法創建NSString對象,NSMutableString構造方法還有很多;?
insertString: 插入字符串, 不會創建新的對象;?
appendString: 追加字符串, 不會創建新的對象;?
deleteCharactersInRange: 在一個范圍內刪除字符串, 不會創建新的對象;?
replaceCharactersInRange: withString: 替換字符串, 不會創建新的對象;
再看斷示例代碼:
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??????
????NSString?*str1?=?@"Objective?C";??
????NSString?*search,*replace;??
????NSMutableString?*mstr;??
????NSRange?substr;??
??????
????//從不可變的字符創建可變字符串對象??
????mstr?=?[NSMutableString?stringWithString:?str1];??
????NSLog(@"?%@",?mstr);??
??????
????//插入字符串??
????[mstr?insertString:?@?"?Java"?atIndex:?9];??
????NSLog(@"?%@",?mstr);??
????//具有連接效果的插入字符串??
????[mstr?insertString:?@?"?and?C++"atIndex:?[mstr?length]];??
????NSLog(@"?%@",?mstr);??
????//字符串連接方法??
????[mstr?appendString:?@?"?and?C"];??
????NSLog(@"?%@",?mstr);??????
????//使用NSRange刪除字符串??
????[mstr?deleteCharactersInRange:NSMakeRange(16,?13)];??
????NSLog(@"?%@",?mstr);??????
????//查找字符串位置??
????substr?=?[mstr?rangeOfString:?@?"string?B?and"];??
????if?(substr.location?!=?NSNotFound)?{??
????????[mstr?deleteCharactersInRange:?substr];??
????????NSLog(@"?%@",?mstr);??
????}??
????//直接設置可變字符串??
????[mstr?setString:?@?"This?is?string?A?"];??
????NSLog(@"?%@",?mstr);??
??????
????[mstr?replaceCharactersInRange:?NSMakeRange(8,?8)??
????????????????????????withString:?@?"a?mutable?string?"];??
????NSLog(@"?%@",?mstr);??
????//查找和替換??
????search?=?@"This?is?";??
????replace?=?@"An?example?of?";??
??????
????substr?=?[mstr?rangeOfString:search];??
??????
????if?(substr.location?!=?NSNotFound)?{??
????????[mstr?replaceCharactersInRange:substr?withString:?replace];??
????????NSLog(@"?%@",?mstr);??
????}??
????//查找和替換所有的情況??
????search?=?@"a";??
????replace?=?@"X";??
????substr?=?[mstr?rangeOfString:?search];??
??????
????while?(substr.location?!=?NSNotFound)?{??
????????[mstr?replaceCharactersInRange:substr?withString:?replace];??
????????substr?=?[mstr?rangeOfString:?search];??
????}??
????NSLog(@"?%@",?mstr);??
??????
??????
??????
????[pool?drain];??
??????
????return?0;??
}??
~~~
我們解釋一下主要代碼:
語句[mstr?deleteCharactersInRange:NSMakeRange(16, 13)] 是刪除指定范圍的字符串,?
函數NSMakeRange 是創建NSRange結構體, 其中第一個參數是位置, 第二個參數是長度,?
語句[mstr?replaceCharactersInRange: NSMakeRange(8, 8) withString:@“a mutable string ”] 替換指定訪問的字符串。?
[mstr?deleteCharactersInRange: substr] 語句是刪除指定范圍的字符串。
數組類
在Foundation框架中數組被封裝成為類,
數組對象:是Foundation數組是有序的對象集合。
數組有兩種:
NSArray不可變數組類和NSMutableArray可變數組類。
注意,需要標記參數數組的結束,將這個數組的最后一個值定為nil,它實際上并不會存儲在數組中。
數組中的元素是由它們的索引數確定的。與NSString對象類似,索引從0開始。
可以通過NSLog格式化字符串%@顯示整個數組。
NSArray類
NSArray有很多方法,?下面是總結常用的方法:?
count:?返回當前數組的長度;?
objectAtIndex:?按照索引返回數組中的元素;?
containsObject: 是否包含某一元素;?
arrayWithObjects: 類級構造方法;?
initWithObjects: 實例構造方法;
NSArray的實例代碼如下:
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??
????NSArray?*weeksNames?=?[NSArray?arrayWithObjects:???
???????????????????????????@"星期一",@"星期二",@"星期三",@"星期四"??
???????????????????????????,@"星期五",@"星期六",@"星期日",nil];??
????NSLog(@"星期名字");??
????NSLog(@"====???====");??
????int?i;??
????for?(i=0;?i??count];i++)?{??
????????NSLog(@"%2i?????%@?",?i+1,?[weeksNames?objectAtIndex:?i]);????????
????}??
??????
??????
????[pool?drain];??
????return?0;??
}??
~~~
arrayWithObjects可以用來創建使用一列對象作為元素的數組。?
在這種情況下,?按順序列出對象并使用逗號隔開。?
使用這個方法必須在列表的最后指定一個結束標志nil?。?
count可以獲得數組的長度。?數組的下標是從0開始的。
NSMutableArray類
NSMutableArray是NSArray的子類,?NSMutableArray有很多方法,?
下面是總結常用的方法:?
addObject:?在數組的尾部追加一個元素;?
insertObject:?在數組的添加一個元素;?
atIndex: 按照索引插入一個元素;?
removeObjectAtIndex: 移除特定索引的元素;?
removeObject: 移除特定元素;?
initWithCapacity: 實例構造方法;
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
?????
????NSMutableArray?*weeksNames?=?[[NSMutableArray?alloc]?initWithCapacity:?3];??
????[weeksNames?addObject:?@"星期一"];?????
????[weeksNames?addObject:?@"星期二"];??
????[weeksNames?addObject:?@"星期三"];?????
????[weeksNames?addObject:?@"星期四"];??
????[weeksNames?addObject:?@"星期五"];??????
????[weeksNames?addObject:?@"星期六"];??
????[weeksNames?addObject:?@"星期日"];????
??????
????NSLog(@"星期名字");??
????NSLog(@"====???====");??
??????
????int?i;??
????for?(i=0;?i??count];i++)???
????????NSLog(@"%2i?????%@?",?i+1,?[weeksNames?objectAtIndex:?i]);???
??????
????[weeksNames?release];??
??
????return?0;??
??????
}??
~~~
[[NSMutableArray alloc] initWithCapacity: 3]?,?可以初始化可變數組并分配3個初始單元,?
如果超過了容量會自動追加的。?
addObject方法可以向數組中添加元素。
NSValue:
數組這樣的Foundation集合只能存儲對象,不能存儲像int這樣的基本數據類型。
NSValue類正好可以將結構轉化為對象,并且把它存儲在集合中。
這種將結構化轉為對象的方式,簡稱為包裝(wrapping),
逆向的處理是從對象中解出基本類型,簡稱展開(unwrapping)。
字典類
字典集合, 它是由“鍵-值”對構成的集合。?
鍵集合不能重復,也就是說字典中的鍵必須是單值的;
值集合沒有特殊要求。?
鍵和值集合中的元素通常是字符串,但也可以是任何對象, 但是不能是nil。?
詞典可以使固定的,也可以是可變的。
可變詞典中的記錄可以動態添加和刪除。
和數組對象不一樣,詞典對象是無序的。
這個字典類與java中的HashMap很相似,也是key-value的格式。
舉例如下:
字典類數據結構模型,?
如圖所示的“學生與學號”集合;

與數組類一樣, 字典類也分為NSDictionary不可變字典和NSMutableDictionary可變字典。?
NSDictionary類
NSDictionary有很多方法,?下面是總結常用的方法:?
count:?字典集合的長度;?
objectForKey:?通過鍵獲得值對象;?
allKeys: 返回所有鍵集合;?
arrayWithObjects: 類級構造方法;?
initWithObjects: 實例構造方法;?
initWithObjects:forKeys: 實例構造方法;?
initWithObjectsAndKeys: 實例構造方法;?
initWithContentsOfFile: 從屬性文件中創建對象;
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
??????
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??
????NSArray?*?keys?=?[@"one?two?three?four?five"?componentsSeparatedByString:@"?"];??
????NSArray?*?values?=?[@"alpha?bravo?charlie?delta?echo"?componentsSeparatedByString:@"?"];???
????NSDictionary?*?dict?=?[[NSDictionary?alloc]?initWithObjects:values?forKeys:keys];??
??????
????NSLog(@"%@",?[dict?description]);??
??????
????[dict?release];??
??????
????[pool?drain];??
????return?0;??
}??
~~~
NSArray * keys = [@“one two three four five”componentsSeparatedByString:@“ ”] 語句是將一個字符
串按照空格分割返回NSArray對象, 同理獲得values對象,
然后使用 NSDictionary * dict = [[NSDictionary alloc]?initWithObjects:values forKeys:keys] 語句
把keys和values放入到不可變字典對象dict中。
NSMutableDictionary類
NSMutableDictionary 是NSDictionary的子類,
NSMutableDictionary有很多方法, 下面是總結常用的方法:?
setObject: forKey: 通過鍵和值;?
removeObjectForKey: 按照鍵移除值;?
writeToFile: atomically: 把對象寫入到文件中;
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??????
????NSMutableDictionary?*mutable?=?[[NSMutableDictionary?alloc]?init];??
??????
????//?add?objects??
????[mutable?setObject:?@"Tom"?forKey:?@"tom@jones.com"];??
????[mutable?setObject:?@"Bob"?forKey:?@"bob@dole.com"?];??
??????
????NSLog(@"%@",?[mutable?description]);??
??????
????[mutable?release];??
??????
????[pool?drain];??
????return?0;??
}??
~~~
NSMutableDictionary *mutable = [[NSMutableDictionary?alloc] init] 是采用默認的init構造方法創建
NSMutableDictionary對象mutable。?
[mutable setObject:@"Tom" forKey: @"tom@jones.com"] 語句是按照鍵tom@jones.com添加Tom對象。
集合對象:
set是一組單值對象集合,它可以是變的或不可以變的。
操作包括:搜索、添加、刪除集合中的成員(僅用于可變集合),比較兩個集合,計算兩個集合的交集和并集等。
這些集合對象包括:NSSet、NSMutableSet、NSIndexSet和NSCountedSet等。
注意,NSIndexSet沒有可變版本。