第九章 Foundation框架中經常使用的類

OC中的類分爲可變和不可變。下表列出了Foundation框架中主要的可變類和不可變類:
正則表達式

種類api

不可變類數組

可變類安全

數組app

NSArray框架

NSMutableArray函數

數據測試

NSData編碼

NSMutableDataatom

詞典

NSDictionary

NSMutableDictionary

集合

NSSet

NSMutableSet

字符串

NSString

NSMutableString

帶屬性的字符串

NSAttributedString

NSMutableAttributedString

字符集合

NSCharacterSet

NSMutableCharacterSet

索引集合

NSIndexSet

NSMutableIndexSet

可變對象的生成:

可變類是不可變類的子類,因此可變類的實例對象可直接做爲不可變類的實例對象。與此相反,若是想把不可變類的實例對象做爲可變類的實例對象來使用的話,可使用mutableCopy方法位不可變對象建立一個可變的副本。

- (id)mutableCopy

字符串類NSString

常量字符串:

NSString*name =@"chenzhen」;

使用這種方式定義的字符串是常量對象,可被做爲NSString的對象使用。既能夠作消息的參數,又能夠作消息的接收者。

@「」表示空字符串,但和nil有區別。

編譯器編譯時會把用空格分割的字符串連在一塊兒:

NSString*name =@"chen"@" "@"zhen」;

字符串常量從程序的執行開始到終止一直存在,調用release或者垃圾回收都不能釋放字符串常量。

NSString:

NSString和NSMutableString的實例稱爲字符串對象或者字符串。字符串對象內部使用Unicode編碼。

將字符串做爲對象來處理的優勢:

能夠統一不少的操做

生成釋放的邏輯相同

NSString還定義了很大經常使用的方法

因爲NSString是以類簇的方式實現的,所以不能用經常使用的方法來爲NSString定義子類。

在初始化方法的說明中,使用alloc和init的組合生成並返回實例的類方法都被標記爲了便利構造函數。下面對NSString的主要方法進行說明:

(1)操做Unicode編碼的字符串

NSString中的漢字都是用Unicode來表示的。Unicode的UTF-8編碼兼容ASCII的7bit編碼,字符串中只含有ASCII的7bit範圍的編碼狀況下,ASCII的字符串可被看成UTF-8的Unicode字符串來處理,不能被看成UTF-16的字符串來處理。

- (

id)initWithUTF8String:(constchar*)bytes//從以Null結束的UTF-8編碼的c字符串中複製信息,並初始化接收者。便利構造器:stringWithUTF8String:

- (

__strongconstchar*)UTF8String//返回編碼爲UTF,以NULL結尾的c語言字符串的指針。基於引用計數的內存管理模式下,返回的字符串會在消息接收對象被釋放的同時被釋放掉。垃圾回收的內存管理模式下,由於返回的是強指針,因此不會被垃圾回收。

- (NSUInteger)length

//返回字符的個數。

- (unichar)characterAtIndex:(NSUInteger)index

//返回索引爲i的字符。unichar是兩字節長的char,表明unicode的一個字符。

-  (id)initWithCharacters:(const unichar *)characters length:(NSUInteger)length

//用characters中存儲的length長的字符串來初始化並返回一個NSString對象,初始化以length爲準,characters中就算包括‘\0’也不能做爲終止標記。便利構造器:stringWithCharacters:length

-  (void)getCharacter:(unichar *)buffer range(NSRange)aRange

//NSRange是一個表示範圍的結構體,其中包括數據的首指針和數據長度。這個函數的做用就是將aRange所表示的字符串做爲Unicode字符串寫入緩衝區buffer,末尾不自動添加NULL,緩衝區須要足夠大。

(2)編碼轉換

C風格或字節類型的字符串和NSString之間能夠相互轉換。字符串編碼定義爲枚舉類型NSStringEncoding。

- (id)initWithCString:(constchar*)nullTerminatedCString

encoding:(NSStringEncoding)encoding

//用C風格字符串初始化一個NSString對象,字符串nullTerminatedCString要求以NULL結尾,編碼爲encoding。便利構造器:stringWithCString:encoding

- (__strongconstchar*)cStringUsingEncoding:(NSStringEncoding)encoding//返回消息接收對象的C風格字符串,編碼由encoding指定。基於引用計數的內存管理模式下,返回的字符串會在消息接收對象被釋放的同時被釋放掉。垃圾回收的內存管理模式下,由於返回的是強指針,因此不會被垃圾回收。

- (id)initWithData:(NSData *)data

encoding:(NSStringEncoding)encoding

//用存儲在data中的二進制數據來初始化NSString對象。

- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding

//接收消息的NSString對象的內容用encoding指定的方法編碼,並將結果存儲到一個NSData對象中並返回。

- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding//測試接收消息的NSString對象可否轉換爲encoding編碼。使用類方法availableStringEncodings可以返回當前環境下能夠用的編碼方式。

-(NSString*)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

//可以對一些特殊字符進行替換,主要被用於處理URL字符串,好比將空格替換成%20等。stringByReplacingPercentEscapesUsingEncoding:是上述方法的逆變換。

(3)生成指定格式的字符串

%@對應的參數必須是一個對象。當輸出%@時(例如:NSLog(@「%@「, test)),實際上就是調用了test的description方法,返回結果存儲到%@中。NSString不支持參數類型自動轉換,因此要保證指定的類型和所傳入的參數的類型一致。

- (id)initWithFormat:(NSString *)format ,...//根據format中指定的格式串來生成一個字符串,使用這個字符串初始化消息接收者。format中的參數用逗號分隔,格式字符串不能爲空。便利構造器:stringWithFormat:

(4)NSString的比較

字符串比較時會返回一個NSComparisonResult類型的值,它是enum型的數據,共有三個值,分別爲NSOrderedAscending,NSOrderedSame,NSOrderedDescending.

- (NSComparisonResult)compare:(NSString *)aString//區分大小寫的比較

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

//不區分大小寫的比較

- (NSComparisonResult)localizedStandardCompare:(NSString *)aString

//按照Mac系統的Finder的排序規則進行比較操做。

- (

BOOL

)isEqualToString:(NSString *)aString

- (

BOOL)hasPrefix:(NSString *)aString//檢查字符串是否以aString開頭。另外還可使用方法commonPrefixWithString:options:來取出消息接收者和參數字符串開頭部分相同的字符串。

(5)爲字符串追加內容

- (NSString *)stringByAppendingString:(NSString *)aString

- (NSString *)stringByAppendingFormat:(NSString *)format

//在接收者字符串後面追加格式化字符串,字符串的具體格式又format指定,而後返回一個新的字符串。

(6)截取字符串

截取指定的字符串並返回。使用結構體NSRange來表示要截取的字符串的開始位置和長度。

- (NSString *)substringToIndex:(NSUInteger)anIndex//返回一個新的字符串,新字符串的範圍是從接收者字符串的第一個字符開始到anIndex結束,anIndex不包含在內

- (NSString *)substringFromIndex:(NSUInteger)anIndex

//返回一個新的字符串,新字符串的範圍是從anIndex開始一直到結尾,anIndex位置的字符也包含在內。

- (NSString *)substringWithRange:(NSRange)aRange

//返回新字符串的開始位置和長度由aRange來指定。

(7)檢索和置換

- (NSRange) rangeOfString:(NSString *)aString//查找到aString則返回aString的位置和長度。若是沒有找到,返回一個位置爲NSNotFound,長度爲0的NSRange類型的對象。

- (NSRange)lineRangeForRange:(NSRange)aRange

//返回NSRange所在行的範圍。

- (NSString *)stringByReplacingCharactersInRange:(NSRange)aRange

withString:(NSString *)replacement

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target

withString:(NSString *)replacement

(8)大小寫的處理

可使用lowercaseString方法將字符串中全部的大寫字母都轉化爲小寫,與此相對,uppercaseString。除了這兩個以外,方法capitalizedString可以將全部單詞的首字母變爲大寫,其他字母變爲小寫。

(9)數值轉換

方法doubleValue可把NSString類型的字符串轉爲double類型的數值。相似的還有floatValue,intValue,integerValue,boolValue.另外當輸入的字符串首字母是Y,y,T,t中的任何一個,或者是不以0開頭的數字時,方法boolValue都會返回YES。

(10)路徑處理

文件的路徑可用NSString來表示。Unix中使用「/」做爲路徑分割符。方法NSHomeDirectory()可以返回當前用戶的主目錄。以文件路徑名@「tmp/image/cat.tif」爲例。

- (NSString *)lastPathComponent//提取文件路徑中最後一個組成部分,上面例子會返回「cat.tiff」。

- (NSString *)stringByAppendingPath:(NSString *)aStr

//將aStr加到現有字符串的末尾並返回,根據須要會自動追加分隔符。

- (NSString *)stringByDeletingLastPathComponent

//刪除路徑中最後一個組成部分,若是返回的結果不是根路徑,那麼最後的路徑分隔符也會被刪除。

- (NSString *)pathExtension

//返回文件擴展名,不包含「.」。沒有擴展名返回空字符串。

- (NSString *)stringByAppendingPathExtension:(NSString *)aString

//將「.」和指定擴展名添加到現有路徑的最後一個組成部分。

- (NSString *)stringByDeletingPathExtension

//刪除文件擴展名,包括「.」,沒有擴展名則返回原來的字符串。

- (

BOOL)isAbsolutePath//判斷路徑是否是一個絕對路徑,若是是則返回YES。

+ (NSString *)pathWithComponents:(NSArray *)components

//使用components中的元素來構建路徑,結合的時候自動添加路徑分隔符」/「。想生成一個絕對路徑的話,數組中的第一個元素使用@」/「。路徑的最後想要以路徑分隔符結尾的話,數組的最後一個元素使用空字符串@」「。

- (NSArray *)pathComponents

//和pathWithComponents:正好相反。

- (NSString *)stringByExpandingTildeInPath

//若是路徑的第一個字符是代字符(以~開頭的,例如:~/),則返回用戶主目錄的路徑字符串。不然,直接返回輸入的字符串。stringByAbbreviatingWithTildeInPath的功能正好相反,會把標準格式的字符串轉換爲使用代字符的字符串。

- (

__strongconstchar*)fileSystemRepresentation//返回路徑的C風格字符串,使用當前系統編碼。

(11)文件的輸入和輸出

- (

id

)initWithContentsOfFile:(NSString *)path

encoding:(NSStringEncoding)enc

error:(NSError **)error

//經過讀取文件path中的內容來初始化一個NSString,文件的編碼爲enc。讀取文件失敗會釋放調用者,並在返回nil的同時將詳細的錯誤信息設定到error。便利構造器:stringWithContentsOfFile:encoding:error:

- (

id

)initWithContentsOfFile:(NSString *)path

usedEncoding:(NSStringEncoding *)enc

error:(NSError **)error

//和上一個方法不一樣的地方在於這個函數可以自動判別文件的編碼,並經過enc返回。文件的編碼是經過文件的內容和擴展屬性來判斷的。便利構造器:stringWithContentsOfFile:usedEncoding:error:

- (

BOOL

)writeToFile:(NSString *)path

atomically:(

BOOL

)useAuxiliaryFile

encoding:(NSStringEncoding)enc

error:(NSError **)error

//用於將字符串的內容寫入到path爲路徑的文件中,寫入的時候使用enc指定的編碼,寫入成功則返回YES。useAuxiliaryFile爲YES的狀況下,會首先新建一個臨時文件,把字符串的內容寫入到臨時文件中。而後再在寫入成功後把臨時文件重命名爲path指定的文件。這種方法寫入發生錯誤時不會損壞原來的文件。爲NO時,則直接將字符串內容輸入到path指定的文件中。若是寫入失敗,則會在返回NO的同時把出錯的緣由寫入到error中,並返回給函數調用者。

(12)其餘

- (id)init//對接收者進行初始化,並返回一個空字符串。一般被用於NSMutableString的初始化。便利構造器:string。

- (

id)initWithString:(NSString *)aString//返回一個字符串對象,其內容是aString的副本。aString也能夠是NSMutableString的實例對象。用這個方法能夠用一個可變的字符串對象生成一個不可變的字符串對象。便利構造器:stringWithString:

- (NSString *)description

//返回消息接收者內容的字符串。NSString的description方法會直接返回self。

- (

id)propertyList//返回消息接收者的屬性列表。

- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)sep

//用參數sep指定的字符集合中的字符做爲分隔符,對消息接收者字符串進行分割,並返回分割後生成的字符串數組。

NSMutableString:

NSMutableString是NSString的子類,因此可使用NSString中定義的全部方法。下面對NSString中未定義的方法進行說明:

(1)實例對象的生成和初始化

- (id)initWithCapacity:(NSUInteger)capacity//初始化一個NSMutableString類型的對象,capacity指明瞭要被初始化的NSMutableString對象的大小.NSMutableString的對象會隨着字符串的變化而自動擴展內存,因此capacity不須要很是精密。除了這個方法以外,還可使用NSString的init方法或NSString的類方法string:來生成一個空的NSMutableString對象。便利構造器:stringWithCapacity:

(2)追加字符串

- (void)appendString:(NSString *)aString//在消息接收者的末尾追加aString。

- (

void)appendFormat:(NSString *)format,……//在消息接收者的末尾遍加format格式的格式化字符串。

(3)插入刪除置換

- (void

)insertString:(NSString *)aString

atIndex:(NSUInteger)loc

//在消息接收者的atlndex位置插人字符串aString。

- (

void)deleteCharactersInRange:(NSRange)range//結構體NSRange表示一個範圍,其中包含了開始位置和長度,這個方法的做用是從接收者中刪除aRange指定範圍內的字符串。

- (

void)setString:(NSString *)aString//複製aString指定的字符串,並將其設置爲消息接收者的內容。

- (

void

)replaceCharactersInRange:(NSRange)aRange

withString:(NSString *)aString

//把aRange指定範圍內的字符內容替換爲aString指定的字符串。

- (NSUInteger)replaceOccurrencesOfString:(NSString *)target

withString:(NSString *) replacement.

options:(NSStringCompareOptions)opts

range:(NSRange)searchRange

//searchRange指定範圍內若是存在字符串target,就將其替換爲replacement。這個函數的返回值就是替換的次數。使用選項opts能夠設置忽略大小寫,或者使用正則表達式進行替換等。

NSData

NSData:

NSData是Cocoa下對二進制數據的一個封裝,可以把二進制數據看成對象來處理。

同C語言的數組相比,NSData的優勢是能夠進行更抽象話的操做,使內存管理更容易,同時也是cocoaAPI中操做二進制數據的標準。

NSData是不可變的,因此實例對象一旦建立以後就不可改變其內容。而若是想改變數據的內容,就須要使用將在後面介紹的類NSMutableData。NSData和NSMutableData的實例對象有時也稱爲數據對象。

NSData的接口文件定義在Foundation/NSData.h中。NSData是以類族的方式實現的,因此不能用一般的方法來爲NSData定義子類下面介紹了類NSData的幾個主要方法,若是想了解所有方法,請參考蘋果公司的文檔。

(1)數據對象的生成和初始化

- (id)initWithBytes:(constvoid*)bytes length:(NSUInteger)length//複製以bytes開頭、長度爲length的數據,進行初始化使其成爲數據對象的內容。便利構造器:dataWithBytes:length:

- (id)initWithBytesNoCopy:(void*)bytes length:(unsigned)length freeWhenDone:(BOOL)flag;//將以bytes開頭、長度爲length的數據初始化爲數據對象的內容。生成的NSData中保存的是指向數據的指針,並無對數據進行復制操做。flag爲YES的時候,生成的NSData對象是bytes的全部者,當NSDate對象被釋放的時候也會同時釋放bytes,因此bytes必須是經過malloc在堆上分配的內存。當flag爲NO的時候,bytes不會被自動釋放,釋放bytes時要注意時機,不要在NSData對象還被使用的時候釋放bytes。便利構造器:datawithBytesNoCopy:length:freeWhenDone:

- (id)initWithData:(NSData *)data//用指定的NSData對象aData來建立一個新的NSData對象。參數能夠是NSMutableData對象,因此用這個方法能夠爲一個可變的NSMutableData對象生成一個不可變的NSData對象。便利構造器:dataWithData:

+ (id)data//返回一個長度爲0的臨時NSDate對象。這個方法多被用於NSMutableData中(建立一個長度爲0的NSData意義不大)。對應的初始化方法爲init。

(2)訪問NSData中的數據

- (NSUInteger)length//返回NSData對象中數據的長度

- (

constvoid*)bytes//返回NSData對象中數據的首指針

- (

void)getBytes:(void*)buffer length:(NSUInteger)length//複製NSData對象的數據到buffer中,複製時從NSData對象中數據的開頭開始,副本的長度爲length。若是想得到指定範圍內的數據的話,可使用方法getBytes:range:

- (NSData *)subdataWithRange:(NSRange)range

//用range指定範圍內的data來生成一個新的NSData對象並返回。

- (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mask range:(NSRange)searchRange

//在接收者中searchRange指定的範圍內,若是能找到和dataToFind同樣的數據,則返回數據的位置和長度。mask是搜索時用到的選項,使用mask能夠從後向前查找。dataToFind不能夠爲nil。

(3)比較

- (BOOL)isEqualToData:(id)anObject//兩個NSData的數據長度和內容一致時返回YES

(4)文件輸入和輸出

能夠從文件讀人數據來初始化NSData對象,或者把NSData對象中的內容輸出到文件。除了用NSString指定文件路徑的函數外,還有使用NSURL來指定文件路徑的函數。

數組類

NSArray:

數組中既能夠存放同一類的對象,也能夠存放不一樣類的對象,但不能夠存放nil,nil被用於標誌數組的結束。

NSArray是不可變數組,一旦建立後,就不能再添加,刪除或修改其中的元素。

數組對象的全部權:

數組,集合和詞典對象這些能夠包含多個對象的容器被總稱爲集合。一個對象被放入集合時會收到retain的消息,被從集合中刪除時也會收到release消息。

快速枚舉:

OC2.0提供了一個用於遍歷容器類的語法,叫作快速枚舉。for...in語法。

集合是可變的也能夠是不可變的,可變集合在循環的過程當中也不容許被改變,若是集合發生了改變,就會拋出異常。

遍歷容器中元素的順序和容器的類型有關。若是是數組,就會從頭開始遍歷,而若是是集合或是詞典類型,遍歷的順序則和容器的內部實現有關。

變量能夠在for的條件中定義,這種狀況下變量只在for...in語法塊內有效。

枚舉器NSEnumerator:

枚舉器是一個用來遍歷集合類中的元素對象的抽象類。枚舉器沒有建立實例的公有接口,不能給枚舉器發送alloc消息。使用枚舉器遍歷一個集合對象的同時,若是向該集合對象增長或刪除對象,就可能會致使不可預期的結果,是很危險的。

基於引用計數管理模式下,在經過枚舉器遍歷集合對象的時候,枚舉器對象擁有這個集合對象的全部權,取出最後一個元素以後,它就會自動放棄對這個集合對象的全部權。同時,由於枚舉器是一個臨時對象,因此當其所在的自動釋放池被釋放的時候,該枚舉器也會被釋放掉。

快速枚舉和枚舉器

快速枚舉和枚舉器在遍歷過程當中,都不能改變集合中的元素。若是在遍歷過程當中想要更改集合對象的話,可使用下標來循環遍歷。若是要刪除集合中的某個元素,須要從後向前遍歷。

快速枚舉內部用c語言實現,速度快。

for...in語法能夠將in後的「集合」換爲「枚舉器」。

集合類:

它是一組單值對象的集合,NSSet是無序的,同一個對象只能保存一個。

NSMutableSet有一個子類NSCountedSet,是一個可變的集合類,能後統計集合中對象的個數,這個類中能夠存放多個相同值的對象。

詞典類

詞典中的數據以鍵值對的形式保存,一個鍵值對稱爲entry。鍵和值能夠是除nil之外的任何對象,通常使用字符串做爲鍵。鍵是關鍵字。

value由多個字符串構成的時候能夠用()把他們括起來,這種狀況下詞典對象的值就至關於一個數組對象。

詞典的鍵必須是惟一的。

詞典對象的值能夠用NSNull來代表一個詞典對象爲空。

一個對象做爲詞典的key或者value時,詞典中存放的是這個對象的一份副本。

NSDictionary:

不可變,一旦建立就只能查詢,不可在增長,刪除,或修改其中的內容。

包裹類

Cocoa Foundation 框架的集合類中只能夠放入對象,不能存儲基本類型的數據。因此Cocoa提供了NSNumber類來包裝char,int,long等基本類型的數據。像結構體,指針這類複雜的數據類型,NSNumber沒有辦法把他們存儲爲對象,這時就可使用NSValue。NSValue是NSNumber的父類,NSValue能夠把任意對象包裝成對象。NSNull是爲了把nil放入集合類中而定義的包裹類。

注意:NSInteger不是一個對象,而是基本的數據類型的typedef。

NSValue:

接口定義在Foundation/NSValue.h中,座標等結構體定義在Foundation/NSGeometry.h中。

類型編碼和@encode()

OC的數據類型甚至自定義類型,均可以使用ASCII編碼的類型描述字符串來表示。@encode()能夠返回給定數據類型的類型描述字符串。例如:@encode(int)返回「i」。

下面是一個爲結構體建立NSValue實例的例子:

struct

grid {

int

x, y;

double

weight;

};

structgridfoo, bar;id

obj;

//對結構體foo進行封裝並返回一個對象obj的代碼

obj = [[NSValue alloc] initWithBytes:&foo objCType:

@encode(struct

grid)];

//把數據從obj中讀入到變量bar中

[obj getValue:&bar];

NSValue只能包裝長度肯定的數據,例如,NSValue不能包裝一個C風格的字符串。

NSValue和NSNumber是以類簇的形式實現的,因此沒法用一般的方法爲其定義子類。

NSNull

nil不能放在數組或字典中,由於nil在它們中有特殊的含義,但有時咱們確實須要一個特殊的對象表示空值。

NSURL

關於URL:

統一資源定位符。除用於因特網以外,也能夠用於表示本機資源。除HTTP協議外,其餘協議也可使用URL來訪問資源。

Mac OS X 和iOS中規定了四種可使用NSURL來訪問資源的形式:

http:超文本連接協議

https:超文本傳輸安全協議http的安全版本,是超文本傳輸協議和SSL/TLS的組合

ftp:文件傳輸協議

file:訪問某臺主機上的文件

訪問某個資源的寫法以下:

協議名://主機名/主機內資源的路徑

操做URL的時候應該使用專用的NSURL類,而不要把URL看成字符串來手工解析。

將string做爲返回值的狀況下,必定要通過url編碼的字符串。方法名中若是包含了string,那麼世紀傳入的參數也必定是通過編碼的。另外一方面,path用於表示URL的路徑,不管做爲返回值仍是參數都要返回爲編碼的字符串。

相關文章
相關標籤/搜索