iOS-Foundation框架中常用的類

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";
  1. @"rose"本質(zhì)上是1個NSString對象,這個對象中存儲的是字符串"rose"爆安。
  2. 將這個字符串對象的地址返回賦值給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和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);
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);
str1與str2指向相同的地址

注意:存儲在常量區(qū)的數(shù)據(jù)不會被回收. 所以存儲在常量區(qū)的字符串對象也不會被回收.

NSString類的常用方法

  1. 使用拼接的方式創(chuàng)建1個NSString對象为牍。
    + (instancetype)stringWithFormat:(NSString *)format, ...
  2. 得到字符串的長度哼绑。
    @property (readonly) NSUInteger length;
  3. 得到字符串中指定下標(biāo)的字符,返回值是unichar類型的 要打印的話使用%C碉咆。
    - (unichar)characterAtIndex:(NSUInteger)index;
  4. 判斷當(dāng)前字符串對象和傳入的字符串對象的內(nèi)容是否相同抖韩。
    - (BOOL)isEqualToString:(NSString *)aString;
    注意:不可以使用==來判斷兩個OC字符串的內(nèi)容是否相同, ==運算符的作用: 比較左右兩邊的數(shù)據(jù)是否相同疫铜,如果兩邊都是指針變量茂浮,那么比較的是指針變量的值也就是地址。
  5. 將C語言的字符串轉(zhuǎn)換為OC字符串對象壳咕。
    + (instancetype)stringWithUTF8String:(NSString *)string;
  6. 將OC字符串對象轉(zhuǎn)換為C語言的字符串.
    @property (nullable, readonly) __strong const char *UTF8String
  7. 將字符串寫入到指定的文件中席揽。
    - (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
  8. 將文件中的內(nèi)容讀取到字符串中.
    + (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
  9. 使用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比較

  1. 字符串比較.
    - (NSComparisonResult)compare:(NSString *)string;
    比較的原理:比較兩個字符串的第 0 個字符的 ASCII 的大小. 如果相等再比較下 1個. 返回值是1個 NSComparisonResut 類型的枚舉.
typedef NS_ENUM(NSInteger, NSComparisonResult) 
{
       NSOrderedAscending = -1L,  //第一個字符串小于傳入的字符串
       NSOrderedSame,    // 相等
       NSOrderedDescending  // 帶個字符串大于傳入的字符串
};
  1. 字符串比較:附加條件的比較
    - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
    NSStringCompareOptions參數(shù)是一個枚舉值舉兩個常用的
NSCaseInsensitiveSearch:  忽略大小寫的比較.        
NSLiteralSearch:  完全匹配的比較. 
  1. 判斷字符串是否以指定的字符串開頭
    - (BOOL)hasPrefix:(NSString *)str;
  2. 判斷字符串是否以指定的字符串結(jié)尾
    - (BOOL)hasSuffix:(NSString *)str;
  3. 在主串中搜索子串.從前往后搜索. 第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. 在主串中搜索子串.從后往前搜索. 第1次匹配的子串.
    NSString *str = @"i love iOS love!";
    NSRange range = [str rangeOfString:@"love" options:NSBackwardsSearch];

NSString的截取

  1. 字符串的截取.截取到字符串中的1部分.
- (NSString *)substringFromIndex:(NSUInteger)from; 從指定的下標(biāo)出一直截取到最后.
- (NSString *)substringToIndex:(NSUInteger)to; 從第0個開始截取指定的個數(shù).
- (NSString *)substringWithRange:(NSRange)range; 截取指定的1段范圍.
  1. 字符串的替換
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

將字符串中第1個參數(shù)替換為第2個參數(shù).原來的指針指向字符串的內(nèi)容是不會變的属桦,新串是以方法的返回值返回的.如果串1中有多個相同的被替換的串,會全部替換他爸。
這個方法還可以做刪除串中的一些字符. 原理: 將想要刪除的字符替換為@""即可聂宾。

  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)換.

  1. 去掉字符串前后的空格,中間的空格無法去掉诊笤。
str =  [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  1. 將轉(zhuǎn)換字符串大小寫
@property (readonly, copy) NSString *uppercaseString; // 轉(zhuǎn)換為大寫
@property (readonly, copy) NSString *lowercaseString; // 換換為小寫
  1. 去掉字符串前后的大寫或小寫字母系谐,或掉頭尾指定的字符串
- (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的常用方法

  1. 追加新的字符串
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... ;
  1. 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的特點

  1. NSArry只能存儲OC對象,不能存儲非OC對象隅居,所以基本數(shù)據(jù)類型等非OC對象需要轉(zhuǎn)化為OC對象才可以存儲钠至。
  2. 這些對象在NSArray數(shù)組中有序存放一個挨著一個。
  3. 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ù)的方法。

  1. 將數(shù)組寫入plist文件中
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
  1. 將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ù)組的信息持久化起來器净。

  1. 將字典數(shù)組的信息保存到plist文件中.
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
  1. 從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對比

  1. 存儲過程
    NSArray數(shù)組的元素按照順序存儲匙赞,
    NSDictionary不是按照順序存儲的佛掖,存儲的下標(biāo)是通過哈希算法算出來的。

  2. 存取的效率
    存儲的時候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ū)翔脱。
如果想要將時間按照我們既定的格式輸出

  1. 先要創(chuàng)建1個NSDateFormatter對象奴拦,這個對象作用就是將1個日期轉(zhuǎn)換成1個指定的格式.
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  2. 告訴這個日期格式化器對象,要把日期轉(zhuǎn)換個什么樣子的届吁。
         yyyy: 年份.
         MM: 月份.
         mm: 分鐘.
         dd: 天.
         hh: 12小時.
         HH: 24小時
         ss: 秒
formatter.dateFormat = @"yyyy年MM月dd日 HH點mm分ss秒";
  1. 使用日期格式化器 將指定的日期轉(zhuǎn)換指定格式的字符串.
NSString *str =[formatter stringFromDate:date];
NSLog(@"str = %@",str);
  1. 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計算時間的方法

  1. 在當(dāng)前時間的基礎(chǔ)之上暂氯,新增指定的時間,得到的1個新的時間亮蛔, 傳入1個負(fù)數(shù) 就是在當(dāng)前時間的基礎(chǔ)之上減指定的秒數(shù)痴施。
+ (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
NSDate *d1 =[NSDate dateWithTimeIntervalSinceNow:8*60*60];
  1. 求兩個時間之間的差,可以用來計算出執(zhí)行代碼所花費的時間究流。
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate;
  1. 得到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形入,一只長大很久但還沒有二夠的家伙全跨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亿遂,隨后出現(xiàn)的幾起案子浓若,更是在濱河造成了極大的恐慌,老刑警劉巖蛇数,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挪钓,死亡現(xiàn)場離奇詭異,居然都是意外死亡耳舅,警方通過查閱死者的電腦和手機碌上,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門倚评,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馏予,你說我怎么就攤上這事天梧。” “怎么了霞丧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵呢岗,是天一觀的道長。 經(jīng)常有香客問我蛹尝,道長后豫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任突那,我火速辦了婚禮挫酿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陨收。我一直安慰自己饭豹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布务漩。 她就那樣靜靜地躺著拄衰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饵骨。 梳的紋絲不亂的頭發(fā)上翘悉,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音居触,去河邊找鬼妖混。 笑死,一個胖子當(dāng)著我的面吹牛轮洋,可吹牛的內(nèi)容都是我干的制市。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼弊予,長吁一口氣:“原來是場噩夢啊……” “哼祥楣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汉柒,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤误褪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碾褂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兽间,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年正塌,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘀略。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恤溶。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屎鳍,靈堂內(nèi)的尸體忽然破棺而出宏娄,到底是詐尸還是另有隱情问裕,我是刑警寧澤逮壁,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站粮宛,受9級特大地震影響窥淆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巍杈,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一忧饭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筷畦,春花似錦词裤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鼎文,卻和暖如春渔肩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拇惋。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工周偎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撑帖。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓蓉坎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胡嘿。 傳聞我的和親對象是個殘疾皇子蛉艾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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