第九章 Foundation框架中常用的類

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ù)都要返回為編碼的字符串典奉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躺翻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卫玖,更是在濱河造成了極大的恐慌公你,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件假瞬,死亡現(xiàn)場(chǎng)離奇詭異陕靠,居然都是意外死亡迂尝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門剪芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)垄开,“玉大人,你說(shuō)我怎么就攤上這事税肪「榷悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵益兄,是天一觀的道長(zhǎng)锻梳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)净捅,這世上最難降的妖魔是什么疑枯? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蛔六,結(jié)果婚禮上荆永,老公的妹妹穿的比我還像新娘。我一直安慰自己古今,他們只是感情好屁魏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捉腥,像睡著了一般氓拼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抵碟,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天桃漾,我揣著相機(jī)與錄音,去河邊找鬼拟逮。 笑死撬统,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敦迄。 我是一名探鬼主播恋追,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罚屋!你這毒婦竟也來(lái)了苦囱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脾猛,失蹤者是張志新(化名)和其女友劉穎撕彤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猛拴,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羹铅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蚀狰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职员。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡麻蹋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廉邑,到底是詐尸還是另有隱情哥蔚,我是刑警寧澤倒谷,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布蛛蒙,位于F島的核電站,受9級(jí)特大地震影響渤愁,放射性物質(zhì)發(fā)生泄漏牵祟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一抖格、第九天 我趴在偏房一處隱蔽的房頂上張望诺苹。 院中可真熱鬧,春花似錦雹拄、人聲如沸收奔。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坪哄。三九已至,卻和暖如春势篡,著一層夾襖步出監(jiān)牢的瞬間翩肌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工禁悠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留念祭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓碍侦,卻偏偏與公主長(zhǎng)得像粱坤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓷产,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Foundation框架中最常用的類站玄。 Foundation框架中最我們經(jīng)常用的類大致有NSString、NSAr...
    xx_cc閱讀 4,936評(píng)論 8 19
  • //將NSData轉(zhuǎn)化為NSString NSString* str = [[NSString alloc] in...
    脫脫夫斯基閱讀 1,148評(píng)論 0 52
  • 大綱 26.Protocol-協(xié)議 27.delegate-代理 28.Foundation框架介紹 29.NSS...
    天天想念閱讀 1,361評(píng)論 0 2
  • 身處寒舍拦英,臨窗蜒什。 聽(tīng),瀟瀟雨落疤估; 賞灾常,江南煙雨霎冯; 吟,無(wú)名小詞钞瀑。 只覺(jué)沈撞,愜意無(wú)比。 問(wèn)雕什,如此境缠俺,誰(shuí)可卻?
    森瑟i閱讀 147評(píng)論 0 0
  • 別瞎想,不是我偿警。我也沒(méi)機(jī)會(huì)躏救,因?yàn)槲椅椿椤?之所以想寫這個(gè),是因?yàn)樽罱戳藘刹筷P(guān)于女性婚內(nèi)出軌為主題的電視劇螟蒸,一部是...
    空心菜abc閱讀 1,582評(píng)論 2 4