OC中的類分為可變和不可變。下表列出了Foundation框架中主要的可變類和不可變類:
種類
不可變類
可變類
數(shù)組
NSArray
NSMutableArray
數(shù)據(jù)
NSData
NSMutableData
詞典
NSDictionary
NSMutableDictionary
集合
NSSet
NSMutableSet
字符串
NSString
NSMutableString
帶屬性的字符串
NSAttributedString
NSMutableAttributedString
字符集合
NSCharacterSet
NSMutableCharacterSet
索引集合
NSIndexSet
NSMutableIndexSet
可變對(duì)象的生成:
可變類是不可變類的子類怖糊,所以可變類的實(shí)例對(duì)象可直接作為不可變類的實(shí)例對(duì)象陷揪。與此相反尺铣,如果想把不可變類的實(shí)例對(duì)象作為可變類的實(shí)例對(duì)象來(lái)使用的話,可以使用mutableCopy方法位不可變對(duì)象創(chuàng)建一個(gè)可變的副本。
- (id)mutableCopy
字符串類NSString
常量字符串:
NSString*name =@"chenzhen”;
使用這種方式定義的字符串是常量對(duì)象牌废,可被作為NSString的對(duì)象使用廉侧。既可以做消息的參數(shù)页响,又可以做消息的接收者。
@“”表示空字符串段誊,但和nil有區(qū)別闰蚕。
編譯器編譯時(shí)會(huì)把用空格分割的字符串連在一起:
NSString*name =@"chen"@" "@"zhen”;
字符串常量從程序的執(zhí)行開(kāi)始到終止一直存在,調(diào)用release或者垃圾回收都不能釋放字符串常量连舍。
NSString:
NSString和NSMutableString的實(shí)例稱為字符串對(duì)象或者字符串没陡。字符串對(duì)象內(nèi)部使用Unicode編碼。
將字符串作為對(duì)象來(lái)處理的優(yōu)點(diǎn):
可以統(tǒng)一很多的操作
生成釋放的邏輯相同
NSString還定義了很大常用的方法
由于NSString是以類簇的方式實(shí)現(xiàn)的索赏,因此不能用常用的方法來(lái)為NSString定義子類盼玄。
在初始化方法的說(shuō)明中,使用alloc和init的組合生成并返回實(shí)例的類方法都被標(biāo)記為了便利構(gòu)造函數(shù)潜腻。下面對(duì)NSString的主要方法進(jìn)行說(shuō)明:
(1)操作Unicode編碼的字符串
NSString中的漢字都是用Unicode來(lái)表示的埃儿。Unicode的UTF-8編碼兼容ASCII的7bit編碼,字符串中只含有ASCII的7bit范圍的編碼情況下融涣,ASCII的字符串可被當(dāng)作UTF-8的Unicode字符串來(lái)處理蝌箍,不能被當(dāng)作UTF-16的字符串來(lái)處理青灼。
- (
id)initWithUTF8String:(constchar*)bytes//從以Null結(jié)束的UTF-8編碼的c字符串中復(fù)制信息,并初始化接收者妓盲。便利構(gòu)造器:stringWithUTF8String:
- (
__strongconstchar*)UTF8String//返回編碼為UTF杂拨,以NULL結(jié)尾的c語(yǔ)言字符串的指針∶醭模基于引用計(jì)數(shù)的內(nèi)存管理模式下弹沽,返回的字符串會(huì)在消息接收對(duì)象被釋放的同時(shí)被釋放掉。垃圾回收的內(nèi)存管理模式下筋粗,因?yàn)榉祷氐氖菑?qiáng)指針策橘,所以不會(huì)被垃圾回收。
- (NSUInteger)length
//返回字符的個(gè)數(shù)娜亿。
- (unichar)characterAtIndex:(NSUInteger)index
//返回索引為i的字符丽已。unichar是兩字節(jié)長(zhǎng)的char,代表unicode的一個(gè)字符买决。
- ?(id)initWithCharacters:(const unichar *)characters length:(NSUInteger)length
//用characters中存儲(chǔ)的length長(zhǎng)的字符串來(lái)初始化并返回一個(gè)NSString對(duì)象沛婴,初始化以length為準(zhǔn),characters中就算包括‘\0’也不能作為終止標(biāo)記督赤。便利構(gòu)造器:stringWithCharacters:length
- ?(void)getCharacter:(unichar *)buffer range(NSRange)aRange
//NSRange是一個(gè)表示范圍的結(jié)構(gòu)體嘁灯,其中包括數(shù)據(jù)的首指針和數(shù)據(jù)長(zhǎng)度。這個(gè)函數(shù)的作用就是將aRange所表示的字符串作為Unicode字符串寫入緩沖區(qū)buffer躲舌,末尾不自動(dòng)添加NULL丑婿,緩沖區(qū)需要足夠大。
(2)編碼轉(zhuǎn)換
C風(fēng)格或字節(jié)類型的字符串和NSString之間可以相互轉(zhuǎn)換没卸。字符串編碼定義為枚舉類型NSStringEncoding羹奉。
- (id)initWithCString:(constchar*)nullTerminatedCString
encoding:(NSStringEncoding)encoding
//用C風(fēng)格字符串初始化一個(gè)NSString對(duì)象,字符串nullTerminatedCString要求以NULL結(jié)尾约计,編碼為encoding尘奏。便利構(gòu)造器:stringWithCString:encoding
- (__strongconstchar*)cStringUsingEncoding:(NSStringEncoding)encoding//返回消息接收對(duì)象的C風(fēng)格字符串,編碼由encoding指定病蛉§偶樱基于引用計(jì)數(shù)的內(nèi)存管理模式下,返回的字符串會(huì)在消息接收對(duì)象被釋放的同時(shí)被釋放掉铺然。垃圾回收的內(nèi)存管理模式下俗孝,因?yàn)榉祷氐氖菑?qiáng)指針,所以不會(huì)被垃圾回收魄健。
- (id)initWithData:(NSData *)data
encoding:(NSStringEncoding)encoding
//用存儲(chǔ)在data中的二進(jìn)制數(shù)據(jù)來(lái)初始化NSString對(duì)象赋铝。
- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding
//接收消息的NSString對(duì)象的內(nèi)容用encoding指定的方法編碼,并將結(jié)果存儲(chǔ)到一個(gè)NSData對(duì)象中并返回沽瘦。
- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding//測(cè)試接收消息的NSString對(duì)象能否轉(zhuǎn)換為encoding編碼革骨。使用類方法availableStringEncodings能夠返回當(dāng)前環(huán)境下可以用的編碼方式农尖。
-(NSString*)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
//能夠?qū)σ恍┨厥庾址M(jìn)行替換,主要被用于處理URL字符串良哲,比如將空格替換成%20等盛卡。stringByReplacingPercentEscapesUsingEncoding:是上述方法的逆變換。
(3)生成指定格式的字符串
%@對(duì)應(yīng)的參數(shù)必須是一個(gè)對(duì)象筑凫。當(dāng)輸出%@時(shí)(例如:NSLog(@“%@“, test))滑沧,實(shí)際上就是調(diào)用了test的description方法,返回結(jié)果存儲(chǔ)到%@中巍实。NSString不支持參數(shù)類型自動(dòng)轉(zhuǎn)換滓技,所以要保證指定的類型和所傳入的參數(shù)的類型一致。
- (id)initWithFormat:(NSString *)format ,...//根據(jù)format中指定的格式串來(lái)生成一個(gè)字符串棚潦,使用這個(gè)字符串初始化消息接收者令漂。format中的參數(shù)用逗號(hào)分隔,格式字符串不能為空丸边。便利構(gòu)造器:stringWithFormat:
(4)NSString的比較
字符串比較時(shí)會(huì)返回一個(gè)NSComparisonResult類型的值叠必,它是enum型的數(shù)據(jù),共有三個(gè)值原环,分別為NSOrderedAscending,NSOrderedSame,NSOrderedDescending.
- (NSComparisonResult)compare:(NSString *)aString//區(qū)分大小寫的比較
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString
//不區(qū)分大小寫的比較
- (NSComparisonResult)localizedStandardCompare:(NSString *)aString
//按照Mac系統(tǒng)的Finder的排序規(guī)則進(jìn)行比較操作挠唆。
- (
BOOL
)isEqualToString:(NSString *)aString
- (
BOOL)hasPrefix:(NSString *)aString//檢查字符串是否以aString開(kāi)頭处窥。另外還可以使用方法commonPrefixWithString:options:來(lái)取出消息接收者和參數(shù)字符串開(kāi)頭部分相同的字符串嘱吗。
(5)為字符串追加內(nèi)容
- (NSString *)stringByAppendingString:(NSString *)aString
- (NSString *)stringByAppendingFormat:(NSString *)format
//在接收者字符串后面追加格式化字符串,字符串的具體格式又format指定滔驾,然后返回一個(gè)新的字符串谒麦。
(6)截取字符串
截取指定的字符串并返回。使用結(jié)構(gòu)體NSRange來(lái)表示要截取的字符串的開(kāi)始位置和長(zhǎng)度哆致。
- (NSString *)substringToIndex:(NSUInteger)anIndex//返回一個(gè)新的字符串绕德,新字符串的范圍是從接收者字符串的第一個(gè)字符開(kāi)始到anIndex結(jié)束,anIndex不包含在內(nèi)
- (NSString *)substringFromIndex:(NSUInteger)anIndex
//返回一個(gè)新的字符串,新字符串的范圍是從anIndex開(kāi)始一直到結(jié)尾摊阀,anIndex位置的字符也包含在內(nèi)耻蛇。
- (NSString *)substringWithRange:(NSRange)aRange
//返回新字符串的開(kāi)始位置和長(zhǎng)度由aRange來(lái)指定。
(7)檢索和置換
- (NSRange) rangeOfString:(NSString *)aString//查找到aString則返回aString的位置和長(zhǎng)度胞此。如果沒(méi)有找到臣咖,返回一個(gè)位置為NSNotFound,長(zhǎng)度為0的NSRange類型的對(duì)象漱牵。
- (NSRange)lineRangeForRange:(NSRange)aRange
//返回NSRange所在行的范圍夺蛇。
- (NSString *)stringByReplacingCharactersInRange:(NSRange)aRange
withString:(NSString *)replacement
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement
(8)大小寫的處理
可以使用lowercaseString方法將字符串中所有的大寫字母都轉(zhuǎn)化為小寫,與此相對(duì)酣胀,uppercaseString刁赦。除了這兩個(gè)之外娶聘,方法capitalizedString能夠?qū)⑺袉卧~的首字母變?yōu)榇髮懀溆嘧帜缸優(yōu)樾憽?/p>
(9)數(shù)值轉(zhuǎn)換
方法doubleValue可把NSString類型的字符串轉(zhuǎn)為double類型的數(shù)值甚脉。類似的還有floatValue丸升,intValue,integerValue,boolValue.另外當(dāng)輸入的字符串首字母是Y,y,T,t中的任何一個(gè)宦焦,或者是不以0開(kāi)頭的數(shù)字時(shí)发钝,方法boolValue都會(huì)返回YES。
(10)路徑處理
文件的路徑可用NSString來(lái)表示波闹。Unix中使用“/”作為路徑分割符酝豪。方法NSHomeDirectory()能夠返回當(dāng)前用戶的主目錄。以文件路徑名@“tmp/image/cat.tif”為例精堕。
- (NSString *)lastPathComponent//提取文件路徑中最后一個(gè)組成部分孵淘,上面例子會(huì)返回“cat.tiff”。
- (NSString *)stringByAppendingPath:(NSString *)aStr
//將aStr加到現(xiàn)有字符串的末尾并返回歹篓,根據(jù)需要會(huì)自動(dòng)追加分隔符瘫证。
- (NSString *)stringByDeletingLastPathComponent
//刪除路徑中最后一個(gè)組成部分,如果返回的結(jié)果不是根路徑庄撮,那么最后的路徑分隔符也會(huì)被刪除背捌。
- (NSString *)pathExtension
//返回文件擴(kuò)展名,不包含“.”洞斯。沒(méi)有擴(kuò)展名返回空字符串毡庆。
- (NSString *)stringByAppendingPathExtension:(NSString *)aString
//將“.”和指定擴(kuò)展名添加到現(xiàn)有路徑的最后一個(gè)組成部分。
- (NSString *)stringByDeletingPathExtension
//刪除文件擴(kuò)展名烙如,包括“.”么抗,沒(méi)有擴(kuò)展名則返回原來(lái)的字符串。
- (
BOOL)isAbsolutePath//判斷路徑是不是一個(gè)絕對(duì)路徑亚铁,如果是則返回YES蝇刀。
+ (NSString *)pathWithComponents:(NSArray *)components
//使用components中的元素來(lái)構(gòu)建路徑,結(jié)合的時(shí)候自動(dòng)添加路徑分隔符”/“徘溢。想生成一個(gè)絕對(duì)路徑的話吞琐,數(shù)組中的第一個(gè)元素使用@”/“。路徑的最后想要以路徑分隔符結(jié)尾的話然爆,數(shù)組的最后一個(gè)元素使用空字符串@”“站粟。
- (NSArray *)pathComponents
//和pathWithComponents:正好相反。
- (NSString *)stringByExpandingTildeInPath
//如果路徑的第一個(gè)字符是代字符(以~開(kāi)頭的施蜜,例如:~/)卒蘸,則返回用戶主目錄的路徑字符串。否則,直接返回輸入的字符串缸沃。stringByAbbreviatingWithTildeInPath的功能正好相反恰起,會(huì)把標(biāo)準(zhǔn)格式的字符串轉(zhuǎn)換為使用代字符的字符串。
- (
__strongconstchar*)fileSystemRepresentation//返回路徑的C風(fēng)格字符串趾牧,使用當(dāng)前系統(tǒng)編碼检盼。
(11)文件的輸入和輸出
- (
id
)initWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc
error:(NSError **)error
//通過(guò)讀取文件path中的內(nèi)容來(lái)初始化一個(gè)NSString,文件的編碼為enc翘单。讀取文件失敗會(huì)釋放調(diào)用者吨枉,并在返回nil的同時(shí)將詳細(xì)的錯(cuò)誤信息設(shè)定到error。便利構(gòu)造器:stringWithContentsOfFile:encoding:error:
- (
id
)initWithContentsOfFile:(NSString *)path
usedEncoding:(NSStringEncoding *)enc
error:(NSError **)error
//和上一個(gè)方法不同的地方在于這個(gè)函數(shù)能夠自動(dòng)判別文件的編碼哄芜,并通過(guò)enc返回貌亭。文件的編碼是通過(guò)文件的內(nèi)容和擴(kuò)展屬性來(lái)判斷的。便利構(gòu)造器:stringWithContentsOfFile:usedEncoding:error:
- (
BOOL
)writeToFile:(NSString *)path
atomically:(
BOOL
)useAuxiliaryFile
encoding:(NSStringEncoding)enc
error:(NSError **)error
//用于將字符串的內(nèi)容寫入到path為路徑的文件中认臊,寫入的時(shí)候使用enc指定的編碼圃庭,寫入成功則返回YES。useAuxiliaryFile為YES的情況下失晴,會(huì)首先新建一個(gè)臨時(shí)文件剧腻,把字符串的內(nèi)容寫入到臨時(shí)文件中。然后再在寫入成功后把臨時(shí)文件重命名為path指定的文件涂屁。這種方法寫入發(fā)生錯(cuò)誤時(shí)不會(huì)損壞原來(lái)的文件书在。為NO時(shí),則直接將字符串內(nèi)容輸入到path指定的文件中拆又。如果寫入失敗儒旬,則會(huì)在返回NO的同時(shí)把出錯(cuò)的原因?qū)懭氲絜rror中,并返回給函數(shù)調(diào)用者遏乔。
(12)其他
- (id)init//對(duì)接收者進(jìn)行初始化义矛,并返回一個(gè)空字符串发笔。通常被用于NSMutableString的初始化盟萨。便利構(gòu)造器:string。
- (
id)initWithString:(NSString *)aString//返回一個(gè)字符串對(duì)象了讨,其內(nèi)容是aString的副本捻激。aString也可以是NSMutableString的實(shí)例對(duì)象。用這個(gè)方法可以用一個(gè)可變的字符串對(duì)象生成一個(gè)不可變的字符串對(duì)象前计。便利構(gòu)造器:stringWithString:
- (NSString *)description
//返回消息接收者內(nèi)容的字符串胞谭。NSString的description方法會(huì)直接返回self。
- (
id)propertyList//返回消息接收者的屬性列表男杈。
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)sep
//用參數(shù)sep指定的字符集合中的字符作為分隔符丈屹,對(duì)消息接收者字符串進(jìn)行分割,并返回分割后生成的字符串?dāng)?shù)組。
NSMutableString:
NSMutableString是NSString的子類旺垒,所以可以使用NSString中定義的所有方法彩库。下面對(duì)NSString中未定義的方法進(jìn)行說(shuō)明:
(1)實(shí)例對(duì)象的生成和初始化
- (id)initWithCapacity:(NSUInteger)capacity//初始化一個(gè)NSMutableString類型的對(duì)象,capacity指明了要被初始化的NSMutableString對(duì)象的大小.NSMutableString的對(duì)象會(huì)隨著字符串的變化而自動(dòng)擴(kuò)展內(nèi)存先蒋,所以capacity不需要非常精密骇钦。除了這個(gè)方法之外,還可以使用NSString的init方法或NSString的類方法string:來(lái)生成一個(gè)空的NSMutableString對(duì)象竞漾。便利構(gòu)造器:stringWithCapacity:
(2)追加字符串
- (void)appendString:(NSString *)aString//在消息接收者的末尾追加aString眯搭。
- (
void)appendFormat:(NSString *)format,……//在消息接收者的末尾遍加format格式的格式化字符串。
(3)插入刪除置換
- (void
)insertString:(NSString *)aString
atIndex:(NSUInteger)loc
//在消息接收者的atlndex位置插人字符串a(chǎn)String业岁。
- (
void)deleteCharactersInRange:(NSRange)range//結(jié)構(gòu)體NSRange表示一個(gè)范圍鳞仙,其中包含了開(kāi)始位置和長(zhǎng)度,這個(gè)方法的作用是從接收者中刪除aRange指定范圍內(nèi)的字符串。
- (
void)setString:(NSString *)aString//復(fù)制aString指定的字符串笔时,并將其設(shè)置為消息接收者的內(nèi)容繁扎。
- (
void
)replaceCharactersInRange:(NSRange)aRange
withString:(NSString *)aString
//把a(bǔ)Range指定范圍內(nèi)的字符內(nèi)容替換為aString指定的字符串。
- (NSUInteger)replaceOccurrencesOfString:(NSString *)target
withString:(NSString *) replacement.
options:(NSStringCompareOptions)opts
range:(NSRange)searchRange
//searchRange指定范圍內(nèi)如果存在字符串target糊闽,就將其替換為replacement梳玫。這個(gè)函數(shù)的返回值就是替換的次數(shù)。使用選項(xiàng)opts可以設(shè)置忽略大小寫右犹,或者使用正則表達(dá)式進(jìn)行替換等提澎。
NSData
NSData:
NSData是Cocoa下對(duì)二進(jìn)制數(shù)據(jù)的一個(gè)封裝,能夠把二進(jìn)制數(shù)據(jù)當(dāng)作對(duì)象來(lái)處理念链。
同C語(yǔ)言的數(shù)組相比盼忌,NSData的優(yōu)點(diǎn)是可以進(jìn)行更抽象話的操作,使內(nèi)存管理更容易掂墓,同時(shí)也是cocoaAPI中操作二進(jìn)制數(shù)據(jù)的標(biāo)準(zhǔn)谦纱。
NSData是不可變的,所以實(shí)例對(duì)象一旦創(chuàng)建之后就不可改變其內(nèi)容君编。而如果想改變數(shù)據(jù)的內(nèi)容跨嘉,就需要使用將在后面介紹的類NSMutableData。NSData和NSMutableData的實(shí)例對(duì)象有時(shí)也稱為數(shù)據(jù)對(duì)象吃嘿。
NSData的接口文件定義在Foundation/NSData.h中祠乃。NSData是以類族的方式實(shí)現(xiàn)的,所以不能用通常的方法來(lái)為NSData定義子類下面介紹了類NSData的幾個(gè)主要方法兑燥,如果想了解全部方法亮瓷,請(qǐng)參考蘋果公司的文檔。
(1)數(shù)據(jù)對(duì)象的生成和初始化
- (id)initWithBytes:(constvoid*)bytes length:(NSUInteger)length//復(fù)制以bytes開(kāi)頭降瞳、長(zhǎng)度為length的數(shù)據(jù)嘱支,進(jìn)行初始化使其成為數(shù)據(jù)對(duì)象的內(nèi)容。便利構(gòu)造器:dataWithBytes:length:
- (id)initWithBytesNoCopy:(void*)bytes length:(unsigned)length freeWhenDone:(BOOL)flag;//將以bytes開(kāi)頭、長(zhǎng)度為length的數(shù)據(jù)初始化為數(shù)據(jù)對(duì)象的內(nèi)容除师。生成的NSData中保存的是指向數(shù)據(jù)的指針赢织,并沒(méi)有對(duì)數(shù)據(jù)進(jìn)行復(fù)制操作。flag為YES的時(shí)候馍盟,生成的NSData對(duì)象是bytes的所有者于置,當(dāng)NSDate對(duì)象被釋放的時(shí)候也會(huì)同時(shí)釋放bytes,所以bytes必須是通過(guò)malloc在堆上分配的內(nèi)存贞岭。當(dāng)flag為NO的時(shí)候八毯,bytes不會(huì)被自動(dòng)釋放,釋放bytes時(shí)要注意時(shí)機(jī)瞄桨,不要在NSData對(duì)象還被使用的時(shí)候釋放bytes话速。便利構(gòu)造器:datawithBytesNoCopy:length:freeWhenDone:
- (id)initWithData:(NSData *)data//用指定的NSData對(duì)象aData來(lái)創(chuàng)建一個(gè)新的NSData對(duì)象。參數(shù)可以是NSMutableData對(duì)象芯侥,所以用這個(gè)方法可以為一個(gè)可變的NSMutableData對(duì)象生成一個(gè)不可變的NSData對(duì)象泊交。便利構(gòu)造器:dataWithData:
+ (id)data//返回一個(gè)長(zhǎng)度為0的臨時(shí)NSDate對(duì)象。這個(gè)方法多被用于NSMutableData中(創(chuàng)建一個(gè)長(zhǎng)度為0的NSData意義不大)柱查。對(duì)應(yīng)的初始化方法為init廓俭。
(2)訪問(wèn)NSData中的數(shù)據(jù)
- (NSUInteger)length//返回NSData對(duì)象中數(shù)據(jù)的長(zhǎng)度
- (
constvoid*)bytes//返回NSData對(duì)象中數(shù)據(jù)的首指針
- (
void)getBytes:(void*)buffer length:(NSUInteger)length//復(fù)制NSData對(duì)象的數(shù)據(jù)到buffer中,復(fù)制時(shí)從NSData對(duì)象中數(shù)據(jù)的開(kāi)頭開(kāi)始唉工,副本的長(zhǎng)度為length研乒。如果想獲得指定范圍內(nèi)的數(shù)據(jù)的話,可以使用方法getBytes:range:
- (NSData *)subdataWithRange:(NSRange)range
//用range指定范圍內(nèi)的data來(lái)生成一個(gè)新的NSData對(duì)象并返回淋硝。
- (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mask range:(NSRange)searchRange
//在接收者中searchRange指定的范圍內(nèi)雹熬,如果能找到和dataToFind一樣的數(shù)據(jù),則返回?cái)?shù)據(jù)的位置和長(zhǎng)度谣膳。mask是搜索時(shí)用到的選項(xiàng)竿报,使用mask可以從后向前查找。dataToFind不可以為nil继谚。
(3)比較
- (BOOL)isEqualToData:(id)anObject//兩個(gè)NSData的數(shù)據(jù)長(zhǎng)度和內(nèi)容一致時(shí)返回YES
(4)文件輸入和輸出
可以從文件讀人數(shù)據(jù)來(lái)初始化NSData對(duì)象烈菌,或者把NSData對(duì)象中的內(nèi)容輸出到文件。除了用NSString指定文件路徑的函數(shù)外犬庇,還有使用NSURL來(lái)指定文件路徑的函數(shù)僧界。
數(shù)組類
NSArray:
數(shù)組中既可以存放同一類的對(duì)象侨嘀,也可以存放不同類的對(duì)象臭挽,但不可以存放nil,nil被用于標(biāo)志數(shù)組的結(jié)束咬腕。
NSArray是不可變數(shù)組欢峰,一旦創(chuàng)建后,就不能再添加,刪除或修改其中的元素纽帖。
數(shù)組對(duì)象的所有權(quán):
數(shù)組宠漩,集合和詞典對(duì)象這些可以包含多個(gè)對(duì)象的容器被總稱為集合。一個(gè)對(duì)象被放入集合時(shí)會(huì)收到retain的消息懊直,被從集合中刪除時(shí)也會(huì)收到release消息扒吁。
快速枚舉:
OC2.0提供了一個(gè)用于遍歷容器類的語(yǔ)法,叫做快速枚舉室囊。for...in語(yǔ)法雕崩。
集合是可變的也可以是不可變的,可變集合在循環(huán)的過(guò)程中也不允許被改變融撞,如果集合發(fā)生了改變盼铁,就會(huì)拋出異常。
遍歷容器中元素的順序和容器的類型有關(guān)尝偎。如果是數(shù)組饶火,就會(huì)從頭開(kāi)始遍歷,而如果是集合或是詞典類型致扯,遍歷的順序則和容器的內(nèi)部實(shí)現(xiàn)有關(guān)肤寝。
變量可以在for的條件中定義,這種情況下變量只在for...in語(yǔ)法塊內(nèi)有效抖僵。
枚舉器NSEnumerator:
枚舉器是一個(gè)用來(lái)遍歷集合類中的元素對(duì)象的抽象類醒陆。枚舉器沒(méi)有創(chuàng)建實(shí)例的公有接口,不能給枚舉器發(fā)送alloc消息裆针。使用枚舉器遍歷一個(gè)集合對(duì)象的同時(shí)刨摩,如果向該集合對(duì)象增加或刪除對(duì)象,就可能會(huì)導(dǎo)致不可預(yù)期的結(jié)果世吨,是很危險(xiǎn)的澡刹。
基于引用計(jì)數(shù)管理模式下,在通過(guò)枚舉器遍歷集合對(duì)象的時(shí)候耘婚,枚舉器對(duì)象擁有這個(gè)集合對(duì)象的所有權(quán)罢浇,取出最后一個(gè)元素之后,它就會(huì)自動(dòng)放棄對(duì)這個(gè)集合對(duì)象的所有權(quán)沐祷。同時(shí)嚷闭,因?yàn)槊杜e器是一個(gè)臨時(shí)對(duì)象,所以當(dāng)其所在的自動(dòng)釋放池被釋放的時(shí)候赖临,該枚舉器也會(huì)被釋放掉胞锰。
快速枚舉和枚舉器:
快速枚舉和枚舉器在遍歷過(guò)程中,都不能改變集合中的元素兢榨。如果在遍歷過(guò)程中想要更改集合對(duì)象的話嗅榕,可以使用下標(biāo)來(lái)循環(huán)遍歷顺饮。如果要?jiǎng)h除集合中的某個(gè)元素,需要從后向前遍歷凌那。
快速枚舉內(nèi)部用c語(yǔ)言實(shí)現(xiàn)兼雄,速度快。
for...in語(yǔ)法可以將in后的“集合”換為“枚舉器”帽蝶。
集合類:
它是一組單值對(duì)象的集合赦肋,NSSet是無(wú)序的,同一個(gè)對(duì)象只能保存一個(gè)励稳。
NSMutableSet有一個(gè)子類NSCountedSet金砍,是一個(gè)可變的集合類,能后統(tǒng)計(jì)集合中對(duì)象的個(gè)數(shù)麦锯,這個(gè)類中可以存放多個(gè)相同值的對(duì)象园匹。
詞典類
詞典中的數(shù)據(jù)以鍵值對(duì)的形式保存钉鸯,一個(gè)鍵值對(duì)稱為entry波桩。鍵和值可以是除nil以外的任何對(duì)象音同,一般使用字符串作為鍵。鍵是關(guān)鍵字料祠。
value由多個(gè)字符串構(gòu)成的時(shí)候可以用()把他們括起來(lái)骆捧,這種情況下詞典對(duì)象的值就相當(dāng)于一個(gè)數(shù)組對(duì)象。
詞典的鍵必須是唯一的髓绽。
詞典對(duì)象的值可以用NSNull來(lái)表明一個(gè)詞典對(duì)象為空敛苇。
一個(gè)對(duì)象作為詞典的key或者value時(shí),詞典中存放的是這個(gè)對(duì)象的一份副本顺呕。
NSDictionary:
不可變枫攀,一旦創(chuàng)建就只能查詢,不可在增加株茶,刪除来涨,或修改其中的內(nèi)容。
包裹類
Cocoa Foundation 框架的集合類中只可以放入對(duì)象启盛,不能存儲(chǔ)基本類型的數(shù)據(jù)蹦掐。所以Cocoa提供了NSNumber類來(lái)包裝char,int僵闯,long等基本類型的數(shù)據(jù)卧抗。像結(jié)構(gòu)體,指針這類復(fù)雜的數(shù)據(jù)類型鳖粟,NSNumber沒(méi)有辦法把他們存儲(chǔ)為對(duì)象社裆,這時(shí)就可以使用NSValue。NSValue是NSNumber的父類牺弹,NSValue可以把任意對(duì)象包裝成對(duì)象浦马。NSNull是為了把nil放入集合類中而定義的包裹類时呀。
注意:NSInteger不是一個(gè)對(duì)象张漂,而是基本的數(shù)據(jù)類型的typedef晶默。
NSValue:
接口定義在Foundation/NSValue.h中,坐標(biāo)等結(jié)構(gòu)體定義在Foundation/NSGeometry.h中航攒。
類型編碼和@encode()
OC的數(shù)據(jù)類型甚至自定義類型磺陡,都可以使用ASCII編碼的類型描述字符串來(lái)表示。@encode()可以返回給定數(shù)據(jù)類型的類型描述字符串漠畜。例如:@encode(int)返回“i”币他。
下面是一個(gè)為結(jié)構(gòu)體創(chuàng)建NSValue實(shí)例的例子:
struct
grid {
int
x, y;
double
weight;
};
structgridfoo, bar;id
obj;
//對(duì)結(jié)構(gòu)體foo進(jìn)行封裝并返回一個(gè)對(duì)象obj的代碼
obj = [[NSValue alloc] initWithBytes:&foo objCType:
@encode(struct
grid)];
//把數(shù)據(jù)從obj中讀入到變量bar中
[obj getValue:&bar];
NSValue只能包裝長(zhǎng)度確定的數(shù)據(jù),例如憔狞,NSValue不能包裝一個(gè)C風(fēng)格的字符串蝴悉。
NSValue和NSNumber是以類簇的形式實(shí)現(xiàn)的,所以無(wú)法用通常的方法為其定義子類瘾敢。
NSNull
nil不能放在數(shù)組或字典中拍冠,因?yàn)閚il在它們中有特殊的含義,但有時(shí)我們確實(shí)需要一個(gè)特殊的對(duì)象表示空值簇抵。
NSURL
關(guān)于URL:
統(tǒng)一資源定位符庆杜。除用于因特網(wǎng)之外,也可以用于表示本機(jī)資源碟摆。除HTTP協(xié)議外晃财,其他協(xié)議也可以使用URL來(lái)訪問(wèn)資源。
Mac OS X 和iOS中規(guī)定了四種可以使用NSURL來(lái)訪問(wèn)資源的形式:
http:超文本鏈接協(xié)議
https:超文本傳輸安全協(xié)議http的安全版本典蜕,是超文本傳輸協(xié)議和SSL/TLS的組合
ftp:文件傳輸協(xié)議
file:訪問(wèn)某臺(tái)主機(jī)上的文件
訪問(wèn)某個(gè)資源的寫法如下:
協(xié)議名://主機(jī)名/主機(jī)內(nèi)資源的路徑
操作URL的時(shí)候應(yīng)該使用專用的NSURL類断盛,而不要把URL當(dāng)作字符串來(lái)手工解析。
將string作為返回值的情況下愉舔,一定要經(jīng)過(guò)url編碼的字符串郑临。方法名中如果包含了string,那么世紀(jì)傳入的參數(shù)也一定是經(jīng)過(guò)編碼的屑宠。另一方面厢洞,path用于表示URL的路徑,無(wú)論作為返回值還是參數(shù)都要返回為編碼的字符串典奉。