Foundation框架中最常用的類桩蓉。
Foundation框架中最我們經(jīng)常用的類大致有NSString增拥、NSArray、NSDictionary等等涮总,雖然不需要將每一個類中提供了什么方法都記下來胸囱,但是需要做到心中有數(shù),知道Foundation框架提供了什么樣的方法瀑梗,能夠達到什么效果烹笔,用到的時候直接去API中查找即可,避免因為不知道有這些方法抛丽,而走彎路谤职。
NSString
NSString創(chuàng)建與內(nèi)存存儲
NSString是1個數(shù)據(jù)類型,用來保存OC字符串铺纽,NSString的本質(zhì)是1個類柬帕,既然是1個類哟忍,所以狡门,最標(biāo)準(zhǔn)的創(chuàng)建NSString對象的方式如下:
NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];
使用這種方式創(chuàng)建的字符串是1個空的字符@""
。
NSString是OC中最常用的1個類了锅很,所以O(shè)C提供了一種更為快速的創(chuàng)建字符串對象的方式:使用前綴@
@"jack";
本質(zhì)上這是1個NSString對象其馏,這個NSString對象中存儲的是"jack"
這個字符串.
NSString *str1 = @"rose";
- @"rose"本質(zhì)上是1個NSString對象,這個對象中存儲的是字符串"rose"爆安。
- 將這個字符串對象的地址返回賦值給str1指針叛复。
格式控制符
%p: 打印指針變量的值即地址。
%@: 打印指針指向的對象扔仓。
NSString的恒定性
當(dāng)我們使用@簡要的創(chuàng)建字符串對象的時候褐奥,也就是使用1個OC字符串常量來初始化字符串指針的時候,這個字符串對象是存儲在常量區(qū)(數(shù)據(jù)段) 的翘簇。當(dāng)我們調(diào)用NSString的類方法來創(chuàng)建對象的時候.創(chuàng)建的字符串對象是存儲在堆區(qū)撬码。
NSString *str = @"jack";
NSString *str1 = [NSString new];
NSLog(@"str:%p",str);
NSLog(@"str1:%p",str1);
上圖中可以看出,str和str1字符串打印的地址差別很大版保,因為str在指向常量區(qū)地址呜笑,而str1指向堆區(qū)的地址夫否。
當(dāng)在內(nèi)存中創(chuàng)建1個字符串對象以后,這個字符串對象的內(nèi)容就無法更改叫胁,當(dāng)我們重新為字符串指針初始化值的時候凰慈,并不是修改原來的字符串對象,而是重新的創(chuàng)建1個字符串對象并將這個字符串對象的地址重新復(fù)制給字符串指針變量驼鹅。
NSString *str1 = @"jack";
NSLog(@"str1 = %p",str1);
str1 = @"rose";
NSLog(@"str1 = %p",str1);
從中可以看出微谓,系統(tǒng)在常量區(qū)重新創(chuàng)建了字符串"rose",并將"rose"的地址賦值給str1输钩。
當(dāng)系統(tǒng)準(zhǔn)備要在內(nèi)存中創(chuàng)建字符串對象的時候堰酿,會先檢查內(nèi)存中是否有相同內(nèi)容的字符串對象,如果有张足,直接指向該內(nèi)存區(qū)域触创,如果沒有才會重新創(chuàng)建。
NSString *str1 = @"jack";
NSLog(@"str1 = %p",str1);
str1 = nil;
NSString *str2 = @"jack";
NSLog(@"str2 = %p",str2);
注意:存儲在常量區(qū)的數(shù)據(jù)不會被回收. 所以存儲在常量區(qū)的字符串對象也不會被回收.
NSString類的常用方法
- 使用拼接的方式創(chuàng)建1個NSString對象为牍。
+ (instancetype)stringWithFormat:(NSString *)format, ... - 得到字符串的長度哼绑。
@property (readonly) NSUInteger length; - 得到字符串中指定下標(biāo)的字符,返回值是unichar類型的 要打印的話使用%C碉咆。
- (unichar)characterAtIndex:(NSUInteger)index; - 判斷當(dāng)前字符串對象和傳入的字符串對象的內(nèi)容是否相同抖韩。
- (BOOL)isEqualToString:(NSString *)aString;
注意:不可以使用==
來判斷兩個OC字符串的內(nèi)容是否相同,==
運算符的作用: 比較左右兩邊的數(shù)據(jù)是否相同疫铜,如果兩邊都是指針變量茂浮,那么比較的是指針變量的值也就是地址。 - 將C語言的字符串轉(zhuǎn)換為OC字符串對象壳咕。
+ (instancetype)stringWithUTF8String:(NSString *)string; - 將OC字符串對象轉(zhuǎn)換為C語言的字符串.
@property (nullable, readonly) __strong const char *UTF8String - 將字符串寫入到指定的文件中席揽。
- (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error; - 將文件中的內(nèi)容讀取到字符串中.
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error; - 使用NSURL讀寫資源,字符串提供了對應(yīng)的方法去讀寫NSURL對象中封裝的資源路徑
//從指定資源路徑讀取文本內(nèi)容.
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//將字符串的內(nèi)容寫入到資源路徑中.
- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
// 如果要向網(wǎng)頁或者ftp寫內(nèi)容要有權(quán)限.
NSString比較
- 字符串比較.
- (NSComparisonResult)compare:(NSString *)string;
比較的原理:比較兩個字符串的第 0 個字符的 ASCII 的大小. 如果相等再比較下 1個. 返回值是1個 NSComparisonResut 類型的枚舉.
typedef NS_ENUM(NSInteger, NSComparisonResult)
{
NSOrderedAscending = -1L, //第一個字符串小于傳入的字符串
NSOrderedSame, // 相等
NSOrderedDescending // 帶個字符串大于傳入的字符串
};
- 字符串比較:附加條件的比較
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
NSStringCompareOptions參數(shù)是一個枚舉值舉兩個常用的
NSCaseInsensitiveSearch: 忽略大小寫的比較.
NSLiteralSearch: 完全匹配的比較.
- 判斷字符串是否以指定的字符串開頭
- (BOOL)hasPrefix:(NSString *)str; - 判斷字符串是否以指定的字符串結(jié)尾
- (BOOL)hasSuffix:(NSString *)str; - 在主串中搜索子串.從前往后搜索. 第1次匹配的子串.
- (NSRange)rangeOfString:(NSString *)searchString;
返回值是1個NSRange類型的結(jié)構(gòu)體變量.
typedef struct _NSRange {
NSUInteger location; 代表子串在主串出現(xiàn)的下標(biāo).
NSUInteger length; 代表子串在主串中匹配的長度.
} NSRange;
如果沒有找到:location 為NSUInteger的最大值, 也就是NSNotFound谓厘,length的值為0幌羞。所以,判斷主字符串中是否包含子字符串,只需要判斷返回的NSRange結(jié)構(gòu)體變量的length是否為0就可以竟稳。
- 在主串中搜索子串.從后往前搜索. 第1次匹配的子串.
NSString *str = @"i love iOS love!";
NSRange range = [str rangeOfString:@"love" options:NSBackwardsSearch];
NSString的截取
- 字符串的截取.截取到字符串中的1部分.
- (NSString *)substringFromIndex:(NSUInteger)from; 從指定的下標(biāo)出一直截取到最后.
- (NSString *)substringToIndex:(NSUInteger)to; 從第0個開始截取指定的個數(shù).
- (NSString *)substringWithRange:(NSRange)range; 截取指定的1段范圍.
- 字符串的替換
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
將字符串中第1個參數(shù)替換為第2個參數(shù).原來的指針指向字符串的內(nèi)容是不會變的属桦,新串是以方法的返回值返回的.如果串1中有多個相同的被替換的串,會全部替換他爸。
這個方法還可以做刪除串中的一些字符. 原理: 將想要刪除的字符替換為@""即可聂宾。
- 字符串?dāng)?shù)據(jù)轉(zhuǎn)換為其他的類型.
@property (readonly) double doubleValue;
@property (readonly) float floatValue;
@property (readonly) int intValue;
@property (readonly) NSInteger integerValue
@property (readonly) long long longLongValue
@property (readonly) BOOL boolValue
轉(zhuǎn)換注意. 從頭開始轉(zhuǎn)換,能轉(zhuǎn)換多少就是多少. 到遇到不能轉(zhuǎn)換的時候就停止轉(zhuǎn)換.
- 去掉字符串前后的空格,中間的空格無法去掉诊笤。
str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
- 將轉(zhuǎn)換字符串大小寫
@property (readonly, copy) NSString *uppercaseString; // 轉(zhuǎn)換為大寫
@property (readonly, copy) NSString *lowercaseString; // 換換為小寫
- 去掉字符串前后的大寫或小寫字母系谐,或掉頭尾指定的字符串
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
[NSCharacterSet characterSetWithCharactersInString:@""]
NSMutableString
NSMutableString為可變的字符串,與NSString不同的是盏混,無論NSMutableString修改多少次蔚鸥,對象始終只有一個惜论,每次修改字符串的時候,修改這個對象中的內(nèi)容即可止喷,不會再重新創(chuàng)建對象馆类。NSMutableString繼承自NSString,并對NSString進行了擴展弹谁,同樣用來存儲字符串乾巧。
NSMutableString的初始化
NSMutableString *str1 = [[NSMutableString alloc]init];
NSMutableString *str2 = [NSMutableString string];
注意:不能直接初始化一個字符串常量給NSMutableString
例如:NSMutableString *str = @"xx_cc";
因為@"xx_cc"是一個父類對象,而str指針是一個子類指針预愤,子類指針不能指向父類對象沟于,當(dāng)調(diào)用str的子類獨有方法的時候就會出錯。
NSMutableString的常用方法
- 追加新的字符串
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... ;
- NSMutableString轉(zhuǎn)化為NSString植康,此時轉(zhuǎn)化后的字符串就具備了恒定型
+ (instancetype)stringWithString:(NSString *)string;
同時NSMutableString也具備NSString的所有方法旷太。
NSString與NSMutableString的使用場景
當(dāng)我們需要多次使用一個固定的字符串的時候還是盡量使用NSString,因為NSString的恒定性销睁,保證不會創(chuàng)建多余的重復(fù)的對象供璧,效率會更高,而當(dāng)需要大量拼接字符串的時候冻记,需要使用NSMutablString睡毒,保證每次拼接都是操作一個對象,不會重復(fù)創(chuàng)建多個對象冗栗,效率較高演顾。
NSArray
NSArray的特點
- NSArry只能存儲OC對象,不能存儲非OC對象隅居,所以基本數(shù)據(jù)類型等非OC對象需要轉(zhuǎn)化為OC對象才可以存儲钠至。
- 這些對象在NSArray數(shù)組中有序存放一個挨著一個。
- NSArray是不可變得军浆,一旦初始化完畢之后棕洋,它里面的元素就永遠(yuǎn)是固定的,無法刪除和新增元素
NSArray的創(chuàng)建
+ (instancetype)array; // 創(chuàng)建一個沒有任何元素的數(shù)組
+ (instancetype)arrayWithObject:(ObjectType)anObject; // 創(chuàng)建只有一個OC對象的數(shù)組
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... ; // 使用多個OC對象初始化數(shù)組
+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;// 使用一個數(shù)組初始化另外一個數(shù)組
- (instancetype)initWithObjects:(ObjectType)firstObj, ... ;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag; // 不知道YESorNO有什么區(qū)別
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path; // 從文件中讀取一個數(shù)組數(shù)據(jù)
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url; // 從URL路徑中讀取一個數(shù)組數(shù)據(jù)
- (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
需要注意的是NSArray中以nil作為標(biāo)志表示數(shù)組元素傳遞結(jié)束乒融,當(dāng)設(shè)置一個對象為nil,NSArray就會以此為標(biāo)志結(jié)束存儲摄悯,后面的對象就沒有辦法存在數(shù)組中了赞季。
因此NSArray中不能存儲nil,會將nil作為元素結(jié)束的標(biāo)志奢驯,并且NSArray中只能存儲OC對象申钩,而nil等于0為基本數(shù)據(jù)類型。
NSArray的常用方法
@property (readonly) NSUInteger count; // 獲取數(shù)組中元素的個數(shù)
- (ObjectType)objectAtIndex:(NSUInteger)index; // 獲取數(shù)組中指定下標(biāo)的元素的值
- (BOOL)containsObject:(ObjectType)anObject; // 判斷數(shù)組中是否包含指定元素
- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray; // 判斷兩個數(shù)組是否相同
@property (nullable, nonatomic, readonly) ObjectType firstObject; // 獲取數(shù)組中第一個元素
@property (nullable, nonatomic, readonly) ObjectType lastObject; // 獲取數(shù)組中最后一個元素
- (void)makeObjectsPerformSelector:(SEL)aSelector ; // 使數(shù)組中所有元素發(fā)送消息
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument // 是數(shù)組中所有元素發(fā)送帶參數(shù)的消息
- (NSUInteger)indexOfObject:(ObjectType)anObject; // 查找指定元素第一次出現(xiàn)的下標(biāo)
- (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range; // 在一定范圍內(nèi)查找指定元素
NSArry的遍歷
使用for循環(huán)瘪阁、for in循環(huán)均可以遍歷數(shù)組撒遣,for in 循環(huán)直接就可以遍歷出數(shù)組元素的值邮偎,要求參數(shù)變量必須與數(shù)組中元素類型一致,如果數(shù)組中元素類型不一致义黎,則可以使用id萬能指針禾进。
另外NSArray也提供了在block中遍歷數(shù)組元素的方法
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// obj:代表便利出來的元素的值 。 idx:代表元素的下標(biāo)
// 如果希望停止遍歷廉涕,將stop指針指向的變量賦值為NO即可
}];
NSArray與字符串
NSArry和NSString中分別提供了將數(shù)組元素拼接成字符串和將字符串分割成數(shù)組的方法
數(shù)組提供的拼接字符串方法
// 將數(shù)組中的所有元素用separator拼接成一個字符串泻云。
- (NSString *)componentsJoinedByString:(NSString *)separator;
字符串提供的分割字符串組成數(shù)組的方法
將字符串以separator分割,每一個字符串成為數(shù)組元素存入到數(shù)組中
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
NSMutableArray
NSMutableArray是NSArray的子類狐蜕,所以NSMutableArray也可以用來存儲數(shù)據(jù)宠纯,唯一不同的是NSMutableArray是可變數(shù)組,存儲在該數(shù)組中的元素可以刪除层释,也可以動態(tài)增加元素婆瓜,其他用法均與NSArray相同。
NSMutableArray常用方法
- (void)addObject:(ObjectType)anObject; // 添加元素贡羔,默認(rèn)添加在最后
- (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index; // 往指定位置添加元素
- (void)removeLastObject; // 刪除最后一個元素
- (void)removeObjectAtIndex:(NSUInteger)index; // 刪除指定元素
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject; // 替換指定位置元素
- (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray; // 添加另一個數(shù)組內(nèi)的所有元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2; // 交換兩個位置的元素
- (void)removeAllObjects; // 刪除所有元素
- (void)removeObject:(ObjectType)anObject inRange:(NSRange)range; // 刪除指定范圍內(nèi)的指定元素
- (void)removeObject:(ObjectType)anObject; // 刪除指定元素
- (void)removeObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range; // 在指定范圍刪除與之相同的元素
- (void)removeObjectIdenticalTo:(ObjectType)anObject; // 刪除與之相同的元素
- (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray; // 刪除與另一數(shù)組中元素相同的元素
- (void)removeObjectsInRange:(NSRange)range; // 刪除指定范圍內(nèi)的元素
- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray range:(NSRange)otherRange; // 使用另外一組元素的指定范圍替換數(shù)組內(nèi)指定范圍元素
- (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray; // 使用另外一個數(shù)組替換數(shù)組內(nèi)指定范圍元素
注意:NSMutableArray不能使用語法糖@[]創(chuàng)建勃救,因為語法糖創(chuàng)建的是不可變數(shù)組。
NSArray的數(shù)據(jù)持久化
有時我們需要將數(shù)組的信息(數(shù)組的元素的值)保存在沙盒中治力,進行數(shù)據(jù)持久化蒙秒,當(dāng)使用到的時候在重沙盒中讀取
可以使用plist文件保存數(shù)組,即將數(shù)組的信息存儲到plist文件中宵统,就會將數(shù)組的所有的元素存儲到這個文件中晕讲。
NSArray提供了寫入數(shù)據(jù)和讀取數(shù)據(jù)的方法。
- 將數(shù)組寫入plist文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- 將plist文件中的數(shù)據(jù)還原為一個數(shù)組马澈。
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
NSDictionary
NSDictionary以鍵值對的形式存儲數(shù)據(jù)瓢省,唯一的key對應(yīng)value,通過key來找到存儲在字典中的value痊班。NSDictionary字典一旦創(chuàng)建完畢勤婚,其鍵值對的個數(shù)就已經(jīng)固定,無法刪除涤伐,新增馒胆。
NSDictionart的創(chuàng)建
// key = name value = xx_cc ,前面的是value后面的是key
NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:@"xx_cc",@"name",@"18",@"age", nil];
// 也可以通過快速創(chuàng)建 key:value
NSDictionary *dict2 = @{@"name":@"xx_cc",@"age":@"18"};
NSDiction的常用方法
@property (readonly) NSUInteger count; // 獲取字典中鍵值對的個數(shù)
- (nullable ObjectType)objectForKey:(KeyType)aKey; // 獲取鍵對應(yīng)的值
@property (readonly, copy) NSArray<KeyType> *allKeys; // 獲取所有的key
@property (readonly, copy) NSArray<ObjectType> *allValues; // 獲取所有value
NSDictionary的遍歷
除使用for in遍歷之外,同樣可以使用block進行遍歷
[dict2 enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
// key 鍵 凝果,obj 值
}];
NSMutableDictionary
可變字典祝迂,相對于字典,可以進行鍵值對的刪除和新增
- (void)removeObjectForKey:(KeyType)aKey; //刪除key對應(yīng)的鍵值對
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey; // 添加鍵值對
- (void)removeAllObjects; // 刪除所有的鍵值對
- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray; // 刪除數(shù)組中所有key的鍵值對
NSDictionary數(shù)據(jù)持久化
NSDictionary也可以將字典數(shù)組的信息持久化起來器净。
- 將字典數(shù)組的信息保存到plist文件中.
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- 從plist文件中還原回字典.
+ (nullable NSDictionary<KeyType, ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;
NSDictionary字典數(shù)組存儲數(shù)據(jù)的原理.
當(dāng)往字典數(shù)組中存儲1個鍵值對的時候型雳,這個鍵值對并不是按照順序挨個挨個的存儲的,存儲鍵值對的時候,會根據(jù)鍵和數(shù)組的長度做1個哈希算法纠俭,算出1個下標(biāo)沿量,將這個鍵值對存儲在該下標(biāo)處。
取值的時候:也是根據(jù)鍵做1個哈希算法冤荆,就可以算出這個鍵值對存儲的下標(biāo)朴则,然后直接找到這個下標(biāo)的數(shù)據(jù)取出就可以了。
NSDictionary與NSArray對比
存儲過程
NSArray數(shù)組的元素按照順序存儲匙赞,
NSDictionary不是按照順序存儲的佛掖,存儲的下標(biāo)是通過哈希算法算出來的。存取的效率
存儲的時候NSArray效率要高一些涌庭,因為NSArray不需要計算下標(biāo)芥被,直接往后存儲即可。
取得時候: 如果取值的時候坐榆,是將所有元素全部取出來拴魄,NSArray效率更高一些
如果取值的時候,只會取數(shù)組中指定的幾個元素席镀,字典數(shù)組取值更快一些匹中。
NSNumber
因為NSArray和NSDictionary都無法存儲基本數(shù)據(jù)類型,所以NSNumber就是用來將基本數(shù)據(jù)類型轉(zhuǎn)化為對象的豪诲。
基本數(shù)據(jù)類型存入數(shù)組需要先將基本數(shù)據(jù)類型轉(zhuǎn)化為對象顶捷,然后存入數(shù)組或者字典中。
基本數(shù)據(jù)類型轉(zhuǎn)化為NSNumber對象
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value;
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value;
也可以使用@直接向基本數(shù)據(jù)類型封裝為對象
@10 代表是1個NSNumber對象屎篱,這個對象中包裝的是整形的10服赎。如果后面的數(shù)據(jù)是1個變量,那么這個變量就必須要使用小括弧括起來交播。
NSNumber對象轉(zhuǎn)化為基本數(shù)據(jù)類型
@property (readonly) char charValue;
@property (readonly) unsigned char unsignedCharValue;
@property (readonly) short shortValue;
@property (readonly) unsigned short unsignedShortValue;
@property (readonly) int intValue;
@property (readonly) unsigned int unsignedIntValue;
@property (readonly) long longValue;
@property (readonly) unsigned long unsignedLongValue;
@property (readonly) long long longLongValue;
@property (readonly) unsigned long long unsignedLongLongValue;
@property (readonly) float floatValue;
@property (readonly) double doubleValue;
@property (readonly) BOOL boolValue;
@property (readonly) NSInteger integerValue;
@property (readonly) NSUInteger unsignedIntegerValue;
NSValue
我們常常遇到NSRange重虑、CGPoint、CGSize秦士、CGRect這些結(jié)構(gòu)體缺厉,他們的變量沒有辦法存儲到集合之中,因此需要先將這些結(jié)構(gòu)體變量存儲到OC對象中隧土,再將OC對象存儲到集合之中提针,NSValue類的對象就是用來包裝結(jié)構(gòu)體變量的。
NSValue的使用也非常簡單次洼,這里不在贅述了关贵。
NSDate
日期類也是會經(jīng)常使用到的限寞,通常需要將服務(wù)器返回的時間進行一些處理悲柱,或者與當(dāng)前時間進行計算怀薛,然后顯示悯许。
NSDate 時間處理
獲得當(dāng)前時間亥啦,得到的是當(dāng)前系統(tǒng)的格林威治時間炭剪,0時區(qū)的時間。
NSDate *date = [NSDate date];
NSLog(@"%@",date);
格式化輸出日期
系統(tǒng)默認(rèn)的格式 年-月-日 時:分:秒 +時區(qū)翔脱。
如果想要將時間按照我們既定的格式輸出
- 先要創(chuàng)建1個NSDateFormatter對象奴拦,這個對象作用就是將1個日期轉(zhuǎn)換成1個指定的格式.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - 告訴這個日期格式化器對象,要把日期轉(zhuǎn)換個什么樣子的届吁。
yyyy: 年份.
MM: 月份.
mm: 分鐘.
dd: 天.
hh: 12小時.
HH: 24小時
ss: 秒
formatter.dateFormat = @"yyyy年MM月dd日 HH點mm分ss秒";
- 使用日期格式化器 將指定的日期轉(zhuǎn)換指定格式的字符串.
NSString *str =[formatter stringFromDate:date];
NSLog(@"str = %@",str);
- NSDate提供了日期類型與字符串相互轉(zhuǎn)換的方法
- (NSString *)stringFromDate:(NSDate *)date; //將日期類型換換為字符串
- (NSDate *)dateFromString:(NSString *)string;//將字符串轉(zhuǎn)換為日期對象.
注意: NSDate取到的時間是格林威治的時間错妖,而NSDateFormatter轉(zhuǎn)換成字符串以后,會自動轉(zhuǎn)換為當(dāng)前系統(tǒng)的時區(qū)的時間疚沐。
NSDate計算時間的方法
- 在當(dāng)前時間的基礎(chǔ)之上暂氯,新增指定的時間,得到的1個新的時間亮蛔, 傳入1個負(fù)數(shù) 就是在當(dāng)前時間的基礎(chǔ)之上減指定的秒數(shù)痴施。
+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
NSDate *d1 =[NSDate dateWithTimeIntervalSinceNow:8*60*60];
- 求兩個時間之間的差,可以用來計算出執(zhí)行代碼所花費的時間究流。
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
- 得到NSDate中的年月日時分秒辣吃。
得到時間的各個部分,可以使用日期格式化器NSCalendar來得到芬探,直接來看一個例子吧
NSDate *date = [NSDate date];
//1.創(chuàng)建1個日歷對象. 調(diào)用類方法currentCalendar得到1個日歷對象.
NSCalendar *calendar = [NSCalendar currentCalendar];
//2.指定日歷對象取到日期的對象的那些部分. 是要取那1個時間對象的部分.
// 返回1個日期組件對象.這個對象中就有指定日期的指定部分.
NSDateComponents *com = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date];
NSLog(@"%ld-%ld-%ld",com.year,com.month,com.day);
文中只是將常用的方法簡單列舉了一下神得,這些方法的功能需要做到心中有數(shù),用到的時候去API里面查詢即可偷仿。也有一些方法雖然不常用哩簿,但是用到的時候,這些方法可以很方便的幫我們解決問題炎疆,不需要自己去實現(xiàn)走很多彎路卡骂。
文中如果有不對的地方歡迎指出。我是xx_cc形入,一只長大很久但還沒有二夠的家伙全跨。