iOS關(guān)鍵字(下):assign/retain/strong/nil/NULL/Nil/NSNull/nan等等

目錄:

(1)alloc/reatain/release/dealloc
(2)autoreleasepool/autorelease
(3)__strong/__weak/__unsafe_unretain/__autoreleasing
(4)assign/retain/copy/weak/strong
(5)assign/retain/strong等
(6)assign/retain/strong等
(7)const
(8)nil/NULL/Nil/NSNull/nan
(9)abs/fabs/fabsf等
(10)NSString格式化輸出
(11)集合類

(6)assign/retain/strong等

synthesize關(guān)鍵字:

根據(jù)@property設(shè)置哄辣,自動生成成員變量相應(yīng)的存取方法魄揉,從而可以使用點操作符來方便的存取該成員變量 惰说。

@implementation:

@implementation 關(guān)鍵字,表明類的實現(xiàn) @end 結(jié)束

self

self 關(guān)鍵字 :類似于java中的this偎漫,是隱藏參數(shù),指向當前調(diào)用方法的類。

super

super 關(guān)鍵字 :調(diào)用父類的方法闲孤。

self = [super init] 這里不是判斷self與[super init]是否相等豪治,而是判斷是否可以成功初始化洞拨。[super init]:父類初始化成功的話,通過=給self负拟,這樣self成為一個非空對象烦衣,整個來說即非false(非NO)。

import

" #import " 告訴預(yù)處理器,將頭文件的內(nèi)容包含到本文件中. OC 中的import 能保證頭文件只會被包含一次 .

interface

@interface關(guān)鍵字:聲明一個Student類掩浙。@end 結(jié)束聲明.
冒號:表示繼承 后面跟的是父類.

NSObject

NSObject是大多數(shù)對象都會用到的內(nèi)存管理,和初始化框架,以及反射和類型操作. 相 當于Object花吟。

NS縮寫

NS是NextSTEP縮寫,表示這個函數(shù)來自Cocoa工具包。

聲明全局變量 , 與C中一樣厨姚。

property

property關(guān)鍵字:設(shè)置成員變量的屬性(有讀/寫衅澈,賦值assign,retain,copy ,以及對多線程的支持nonatomic)。

Function

聲明一個方法遣蚀,格式是
–(返回值) 方法關(guān)鍵字1 : (參數(shù)類型)參數(shù)名 方法關(guān)鍵字2 : (參數(shù)類型)參數(shù)名 …… (在讀方法的時候就可以先找方法關(guān)鍵字來確定參數(shù))矾麻。

'+' 和 '-' 號

' - '減號是實例方法, ' + ' 是類方法

Designated Initializer

另一個初始化方法中調(diào)用已有的初始化方法 這種概念被稱為Designated Initializer.

NSLog

NSLog是OC中的標準輸出, 附加輸出當時日期, 時間, 應(yīng)用程序名稱 . 使用NSLog()輸出任意對象的值時,都會使用%@格式說明芭梯。在使用這個說明符時,對象通過一個名為description的方法提供自己的NSLog()格式险耀。

getter/setter

使用@property配合@synthesize可以讓編譯器自動實現(xiàn)getter/setter方法,使用的時候也很方便玖喘,可以直接使用“對象.屬性”的方法調(diào)用;

如果我們想要”對象.方法“的方式來調(diào)用一個方法并獲取到方法的返回值甩牺,那就需要使用@property配合@dynamic了

dynamic

使用@dynamic關(guān)鍵字是告訴編譯器由我們自己來實現(xiàn)訪問方法。如果使用的是@synthesize累奈,那么這個工作編譯器就會幫你實現(xiàn)了贬派。

readonly

readonly此標記說明屬性是只讀的急但,默認的標記是讀寫,如果你指定了只讀搞乏,在@implementation中只需要一個讀取器波桩。或者如果你使用@synthesize關(guān)鍵字请敦,也是有讀取器方法被解析镐躲。而且如果你試圖使用點操作符為屬性賦值,你將得到一個編譯錯誤侍筛。

readwrite

readwrite此標記說明屬性會被當成讀寫的萤皂,這也是默認屬性。設(shè)置器和讀取器都需要在@implementation中實現(xiàn)匣椰。如果使用@synthesize關(guān)鍵字裆熙,讀取器和設(shè)置器都會被解析。

nonatomic

nonatomic:非原子性訪問禽笑,對屬性賦值的時候不加鎖入录,多線程并發(fā)訪問會提高性能。如果不加此屬性蒲每,則默認是兩個訪問方法都為原子型事務(wù)訪問纷跛。

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

atomic

設(shè)置成員變量的@property屬性時邀杏,默認為atomic贫奠,提供多線程安全。

在多線程環(huán)境下望蜡,原子操作是必要的唤崭,否則有可能引起錯誤的結(jié)果。加了atomic脖律,setter函數(shù)會變成下面這樣:

{lock}
  if (property != newValue) { 
          [property release]; 
          property = [newValue retain]; 
  }
{unlock}

nonatomic
禁止多線程谢肾,變量保護,提高性能小泉。

atomic是Objc使用的一種線程保護技術(shù)芦疏,基本上來講,是防止在寫未完成的時候被另外一個線程讀取微姊,造成數(shù)據(jù)錯誤酸茴。而這種機制是耗費系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上兢交,如果沒有使用多線程間的通訊編程薪捍,那么nonatomic是一個非常好的選擇。

指出訪問器不是原子操作,而默認地酪穿,訪問器是原子操作凳干。這也就是說,在多線程環(huán)境下被济,解析的訪問器提供一個對屬性的安全訪問救赐,從獲取器得到的返回值或者通過設(shè)置器設(shè)置的值可以一次完成,即便是別的線程也正在對其進行訪問溉潭。如果你不指定 nonatomic 净响,在自己管理內(nèi)存的環(huán)境中,解析的訪問器保留并自動釋放返回的值喳瓣,如果指定了 nonatomic ,那么訪問器只是簡單地返回這個值赞别。

assign:

簡單賦值畏陕,不更改索引計數(shù)
對基礎(chǔ)數(shù)據(jù)類型 (例如NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char, 等) 適用簡單數(shù)據(jù)類型

此標記說明設(shè)置器直接進行賦值仿滔,這也是默認值惠毁。在使用垃圾收集的應(yīng)用程序中,如果你要一個屬性使用assign崎页,且這個類符合NSCopying協(xié)議鞠绰,你就要明確指出這個標記,而不是簡單地使用默認值飒焦,否則的話蜈膨,你將得到一個編譯警告。這再次向編譯器說明你確實需要賦值牺荠,即使它是可拷貝的翁巍。

copy:

建立一個索引計數(shù)為1的對象,然后釋放舊對象

對NSString 它指出 : 在賦值時使用傳入值的一份拷貝休雌≡詈拷貝工作由copy方法執(zhí)行,此屬性只對那些實行了NSCopying協(xié)議的對象類型有效杈曲。更深入的討論驰凛,請參考“復(fù)制”部分。

retain:

釋放舊的對象担扑,將舊對象的值賦予輸入對象恰响,再提高輸入對象的索引計數(shù)為1
對其他NSObject和其子類

對參數(shù)進行release舊值,再retain新值

指定retain會在賦值時喚醒傳入值的retain消息魁亦。此屬性只能用于Objective-C對象類型渔隶,而不能用于Core Foundation對象。(原因很明顯,retain會增加對象的引用計數(shù)间唉,而基本數(shù)據(jù)類型或者Core Foundation對象都沒有引用計數(shù)——譯者注)绞灼。

注意: 把對象添加到數(shù)組中時,引用計數(shù)將增加對象的引用次數(shù)+1呈野。

retain的實際語法為:

- (void)setName:(NSString *)newName { 
    if (name != newName) { 
       [name release]; 
       name = [newName retain]; 
       // name’s retain count has been bumped up by 1 
    } 
}

copy與retain:

Copy其實是建立了一個相同的對象低矮,而retain不是:

  1. copy:
    比如一個NSString對象,地址為0×1111被冒,內(nèi)容為@”STR”
    Copy到另外一個NSString之后军掂,地址為0×2222,內(nèi)容相同昨悼,新的對象retain為1蝗锥,舊有對象沒有變化

  2. retain:
    retain到另外一個NSString之后,地址相同(建立一個指針率触,指針拷貝)终议,內(nèi)容當然相同,這個對象的retain值+1
    也就是說葱蝗,retain是指針拷貝穴张,copy是內(nèi)容拷貝。哇两曼,比想象的簡單多了…

retain的set方法應(yīng)該是淺復(fù)制皂甘,copy的set方法應(yīng)該是深復(fù)制了

copy另一個用法:

copy是內(nèi)容的拷貝 ,對于像NSString,的確是這樣.

但是,如果是copy的是一個NSArray呢?比如,

NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy]; 

這個時候,系統(tǒng)的確是為array2開辟了一塊內(nèi)存空間,但是我們要認識到的是,array2中的每個元素,,只是copy了指向array中相對應(yīng)元素的指針.這便是所謂的"淺復(fù)制".

assign與retain:

  1. 接觸過C,那么假設(shè)你用malloc分配了一塊內(nèi)存悼凑,并且把它的地址賦值給了指針a偿枕,后來你希望指針b也共享這塊內(nèi)存,于是你又把a賦值給(assign)了b佛析。

此時a和b指向同一塊內(nèi)存益老,請問當a不再需要這塊內(nèi)存,能否直接釋放它寸莫?

答案是否定的捺萌,因為a并不知道b是否還在使用這塊內(nèi)存,如果a釋放了膘茎,那么b在使用這塊內(nèi)存的時候會引起程序crash掉桃纯。

  1. 了解到1中assign的問題,那么如何解決披坏?

最簡單的一個方法就是使用引用計數(shù)(reference counting)态坦,還是上面的那個例子,我們給那塊內(nèi)存設(shè)一個引用計數(shù)棒拂,當內(nèi)存被分配并且賦值給a時伞梯,引用計數(shù)是1玫氢。當把a賦值給b時引用計數(shù)增加到2。這時如果a不再使用這塊內(nèi)存谜诫,它只需要把引用計數(shù)減1漾峡,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時也把引用計數(shù)減1喻旷。

當引用計數(shù)變?yōu)?的時候生逸,代表該內(nèi)存不再被任何指針所引用,系統(tǒng)可以把它直接釋放掉且预。

總結(jié):上面兩點其實就是assign和retain的區(qū)別槽袄,assign就是直接賦值,從而可能引起1中的問題锋谐,當數(shù)據(jù)為int, float等原生類型時遍尺,可以使用assign。

retain就如2中所述涮拗,使用了引用計數(shù)狮鸭,retain引起引用計數(shù)加1, release引起引用計數(shù)減1,當引用計數(shù)為0時多搀,dealloc函數(shù)被調(diào)用,內(nèi)存被回收灾部。

assign retain copy 簡析

NSString *pt = [[NSString alloc] initWithString:@"abc"];

上面一段代碼會執(zhí)行以下兩個動作

  1. 在堆上分配一段內(nèi)存用來存儲@"abc" 比如:內(nèi)存地址為:0X1111 內(nèi)容為 "abc"
  1. 在棧上分配一段內(nèi)存用來存儲pt 比如:地址為:0Xaaaa 內(nèi)容自然為0X1111

下面分別看下assign retain copy

1. assign的情況:

NSString *newPt = [pt assign];
此時newPt和pt完全相同 地址都是0Xaaaa 內(nèi)容為0X1111 即newPt只是pt的別名康铭,對任何一個操作就等于對另一個操作。 因此retainCount不需要增加赌髓。

2. retain的情況:

NSString *newPt = [pt retain];
此時newPt的地址不再為0Xaaaa从藤,可能為0Xaabb 但是內(nèi)容依然為0X1111。 因此newPt 和 pt 都可以管理"abc"所在的內(nèi)存锁蠕。因此 retainCount需要增加1

3. copy的情況:

NSString *newPt = [pt copy];
此時會在堆上重新開辟一段內(nèi)存存放@"abc" 比如0X1122 內(nèi)容為@"abc 同時會在棧上為newPt分配空間 比如地址:0Xaacc 內(nèi)容為0X1122 因此retainCount增加1供newPt來管理0X1122這段內(nèi)存

(7)const

const

1.沒有const修飾的指針

指針p和*p都能被修改

// 定義一個指針變量
int *p = NULL;
 
// 定義2個int類型的變量
int a = 10;
int b = 30;
 
// p指向a
p = &a;
*p = 20;
 
// p指向b
p = &b;
*p = 40;
 
NSLog(@"%d %d", a, b);

2.const修飾的*p

被const修飾的*p只能被賦值一次夷野,以后不能賦值,否則編譯器報錯

// const修飾的*p
const int *p = NULL;
int const *p = null;
 
*p = 20; // 編譯器報錯荣倾,不能修改*p的值

3.const修飾的p

被const修飾的p只能存一次地址悯搔,以后再也不能其它存地址了,否則編譯器報錯

// const修飾的指針變量p
int * const p = NULL;
int a = 20;
p = &a; // 編譯器報錯舌仍,不能修改指針變量p
  1. const在聲明字符串的用法

NSString * const ZMJName = @"jack";

static和const聯(lián)合使用

static將一個全局變量變成局部變量
const將一個局部變量變成局部常量

// 定義了一個局部常量
static const CGFloat ZMJRed = 0.4;
static const CGFloat ZMJGreen = 0.6;
static const CGFloat ZMJBlue = 0.7;

使用static const 與 #define

使用static const修飾變量和宏定義的比較
1. 相同點
都不能再被修改
一處修改妒貌,其它都改了
2. 不同點
static const修飾變量只有一份內(nèi)存
宏定義,只是簡單的替換铸豁,每次使用都需要創(chuàng)建一份內(nèi)存
結(jié)論
使用static const修飾更加高效灌曙,在同一個文件內(nèi)可以使用static const取代#define

// static const修飾變量只有一份內(nèi)存
static const CGFloat ZMJRed = 0.4;
     
// 宏定義,只是用0.4替換ZMJRed节芥,每次使用都需要創(chuàng)建一份內(nèi)存
#define ZMJRed 0.4

const實際開發(fā)的應(yīng)用

一般會先新建ZMJConst.h文件專門存放常量的引用

// 引用某變量在刺,如果沒有使用const修飾,就不能直接在編譯的時候就能檢測是否修改了ZMJRed
extern const CGFloat ZMJRed;
extern NSString * const ZMJName;

可以模仿系統(tǒng)UIKIT_EXTERN來代替extern,逼格更高蚣驼!
UIKIT_EXTERN const CGFloat ZMJRed;
UIKIT_EXTERN NSString * const ZMJName;

一般會新建ZMJConst.m文件專門存放static const修飾的變量魄幕,需要用的時候?qū)腩^文件就可以了。

// 定義了整個程序都能訪問的常量
const CGFloat ZMJRed = 0.4;
NSString * const ZMJName = @"jack";

const與宏的區(qū)別(面試題):

const簡介:之前常用的字符串常量隙姿,一般是抽成宏梅垄,但是蘋果不推薦我們抽成宏,推薦我們使用const常量输玷。

1.編譯時刻:宏是預(yù)編譯(編譯之前處理)队丝,const是編譯階段。
2.編譯檢查:宏不做檢查欲鹏,不會報編譯錯誤机久,只是替換,const會編譯檢查赔嚎,會報編譯錯誤膘盖。

3.宏的好處:宏能定義一些函數(shù),方法尤误。 const不能侠畔。
4.宏的壞處:使用大量宏,容易造成編譯時間久损晤,每次都需要重新替換软棺。

注意:很多Blog都說使用宏,會消耗很多內(nèi)存尤勋,我這驗證并不會生成很多內(nèi)存喘落,宏定義的是常量,常量都放在常量區(qū)最冰,只會生成一份內(nèi)存瘦棋。

    // 常見的常量:抽成宏
    #define XMGAccount @"account"
     
    #define XMGUserDefault [NSUserDefaults standardUserDefaults]
     
    // 字符串常量
    static NSString * const account = @"account";
     
    - (void)viewDidLoad {
        [super viewDidLoad];
     
        // 偏好設(shè)置存儲
        // 使用宏
        [XMGUserDefault setValue:@"123" forKey:XMGAccount];
     
        // 使用const常量
        [[NSUserDefaults standardUserDefaults] setValue:@"123" forKey:account];
     
    }

const作用:限制類型

1.const僅僅用來修飾右邊的變量(基本數(shù)據(jù)變量p,指針變量*p)
2.被const修飾的變量是只讀的暖哨。
const基本使用
    - (void)viewDidLoad {
        [super viewDidLoad];
     
        // 定義變量
        int a = 1;
     
        // 允許修改值
        a = 20;
     
        // const兩種用法
        // const:修飾基本變量p
        // 這兩種寫法是一樣的赌朋,const只修飾右邊的基本變量b
        const int b = 20; // b:只讀變量
        int const b = 20; // b:只讀變量
     
        // 不允許修改值
        b = 1;
     
        // const:修飾指針變量*p,帶*的變量鹿蜀,就是指針變量.
        // 定義一個指向int類型的指針變量箕慧,指向a的地址
        int *p = &a;
     
        int c = 10;
     
        p = &c;
     
        // 允許修改p指向的地址,
        // 允許修改p訪問內(nèi)存空間的值
        *p = 20;
     
        // const修飾指針變量訪問的內(nèi)存空間茴恰,修飾的是右邊*p1颠焦,
        // 兩種方式一樣
        const int *p1; // *p1:常量 p1:變量
        int const *p1; // *p1:常量 p1:變量
     
        // const修飾指針變量p1
        int * const p1; // *p1:變量 p1:常量
     
     
        // 第一個const修飾*p1 第二個const修飾 p1
        // 兩種方式一樣
        const int * const p1; // *p1:常量 p1:常量
     
        int const * const p1;  // *p1:常量 p1:常量
     
    }

const開發(fā)中使用場景:

1.需求1:提供一個方法,這個方法的參數(shù)是地址往枣,里面只能通過地址讀取值,不能通過地址修改值
2.需求2:提供一個方法伐庭,這個方法的參數(shù)是地址粉渠,里面不能修改參數(shù)的地址。
    @implementation ViewController
     
    // const放*前面約束參數(shù)圾另,表示*a只讀
    // 只能修改地址a,不能通過a修改訪問的內(nèi)存空間
    - (void)test:(const int * )a
    {
    //    *a = 20;
    }
     
    // const放*后面約束參數(shù)霸株,表示a只讀
    // 不能修改a的地址,只能修改a訪問的值
    - (void)test1:(int * const)a
    {
        int b;
        // 會報錯
        a = &b;
     
        *a = 2;
    }
     
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
     
        int a = 10;
     
        // 需求1:提供一個方法集乔,這個方法的參數(shù)是地址去件,里面只能通過地址讀取值,不能通過地址修改值。
     
        // 這時候就需要使用const扰路,約束方法的參數(shù)只讀.
        [self test:&a];
     
        // 需求2:提供一個方法尤溜,這個方法的參數(shù)是地址,里面不能修改參數(shù)的地址汗唱。
        [self test1:&a];
    }
    @end

static和extern簡單使用(要使用一個東西宫莱,先了解其作用)

static作用:

    修飾局部變量:

    1.延長局部變量的生命周期,程序結(jié)束才會銷毀。

    2.局部變量只會生成一份內(nèi)存,只會初始化一次哩罪。

    3.改變局部變量的作用域授霸。

    修飾全局變量

    1.只能在本文件中訪問,修改全局變量的作用域,生命周期不會改

    2.避免重復(fù)定義全局變量

extern作用:
    只是用來獲取全局變量(包括全局靜態(tài)變量)的值,不能用于定義變量
extern工作原理:
    先在當前文件查找有沒有全局變量际插,沒有找到碘耳,才會去其他文件查找。
    // 全局變量:只有一份內(nèi)存框弛,所有文件共享藏畅,與extern聯(lián)合使用。
    int a = 20;
     
    // static修飾全局變量
    static int age = 20;
     
    - (void)test
    {
        // static修飾局部變量
        static int age = 0;
        age++;
        NSLog(@"%d",age);
    }
     
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self test];
        [self test];
     
        extern int age;
        NSLog(@"%d",age);
    }

static與const聯(lián)合使用

static與const作用:聲明一個只讀的靜態(tài)變量
開發(fā)使用場景:在一個文件中經(jīng)常使用的字符串常量功咒,可以使用static與const組合

// 開發(fā)中常用static修飾全局變量,只改變作用域
 
// 為什么要改變?nèi)肿兞孔饔糜颍乐怪貜?fù)聲明全局變量绞蹦。
 
// 開發(fā)中聲明的全局變量力奋,有些不希望外界改動,只允許讀取幽七。
 
// 比如一個基本數(shù)據(jù)類型不希望別人改動
 
// 聲明一個靜態(tài)的全局只讀常量
static const int a = 20;
 
// staic和const聯(lián)合的作用:聲明一個靜態(tài)的全局只讀常量
 
// iOS中staic和const常用使用場景景殷,是用來代替宏,把一個經(jīng)常使用的字符串常量澡屡,定義成靜態(tài)全局只讀變量.
 
// 開發(fā)中經(jīng)常拿到key修改值猿挚,因此用const修飾key,表示key只讀,不允許修改驶鹉。
static  NSString * const key = @"name";
 
// 如果 const修飾 *key1,表示*key1只讀绩蜻,key1還是能改變。
 
static  NSString const *key1 = @"name";

extern與const聯(lián)合使用

開發(fā)中使用場景:在多個文件中經(jīng)常使用的同一個字符串常量室埋,可以使用extern與const組合办绝。
原因:
    static與const組合:在每個文件都需要定義一份靜態(tài)全局變量伊约。
    extern與const組合:只需要定義一份全局變量,多個文件共享孕蝉。
全局常量正規(guī)寫法:開發(fā)中便于管理所有的全局變量屡律,通常搞一個GlobeConst文件,里面專門定義全局變量降淮,統(tǒng)一管理超埋,要不然項目文件多不好找。

GlobeConst.h
    extern NSString * const nameKey = @"name";
     
GlobeConst.m
    #import <Foundation/Foundation.h>
  
    NSString * const nameKey = @"name";

(8)nil/NULL/Nil/NSNull/nan

一 : 定義

nil

定義一個空的實例佳鳖,指向OC中對象的空指針霍殴。

示例代碼:

 NSString *someString = nil;
 NSURL *someURL = nil;
 id someObject = nil;
 if (anotherObject == nil) // do something

用法講解:

當對某個對象release 的同時最好把他們賦值為nil,這樣可以確保安全性,如果不賦值nil求晶,可能導(dǎo)致程序崩潰.

NSArray * array = [NSArray arrayWithObjects:@"test",@"test1" ,nil];
[array release];
if (array) {
      //僅僅對數(shù)組release凄贩,并沒有賦值為nil,在程序某個地方如果繼續(xù)對數(shù)組操作巾腕,程序直接崩潰
      NSString * string = [array objectAtIndex:0];
      NSLog(@"%@",string);
}

NULL

NULL可以用在C語言的各種指針上。

 #define __DARWIN_NULL 
 #define__DARWIN_NULLConstants
 示例代碼:
 int *pointerToInt = NULL;    
 char *pointerToChar = NULL;  
 struct TreeNode *rootNode = NULL;

用法講解:
在Objective-C里絮蒿,nil對象被設(shè)計來跟NULL空指針關(guān)聯(lián)的尊搬。他們的區(qū)別就是nil是一個對象,而NULL只是一個值土涝。而且我們對于nil調(diào)用方法佛寿,不會產(chǎn)生crash或者拋出異常。

Nil

定義一個空的類

示例代碼:

 Class someClass = Nil; 
 Class anotherClass = [NSString class];

NSNull

NSNull是一個類但壮,它定義了一個單例對象用于表示集合對象的空值

集合對象無法包含nil作為其具體值冀泻,如NSArray、NSSet和NSDictionary蜡饵。相應(yīng)地弹渔,nil值用一個特定的對象
NSNull來表示。NSNull提供了一個單一實例用于表示對象屬性中的的nil值溯祸。默認的實現(xiàn)方法中肢专,
dictionaryWithValuesForKeys:和setValuesForKeysWithDictionary:自動地將 NSNull和nil相互轉(zhuǎn)換,因此您的對象不需要進行NSNull的測試操作焦辅。

NAN

比如當進行除法運算時,分母為0,就會導(dǎo)致結(jié)果為NAN.

nan的意思就是not a number博杖。

主要常見原因:

  • 除以0
  • sizeWithFont的字符串為nil
  • 數(shù)學(xué)函數(shù)不正確運算

解決方法除了排除根源所在之外,用函數(shù)isnan()也是不錯的選擇(至少在沒有徹底解決以前)
如下

float _x = NAN;
if (!isnan(_x)) {
cell.imgView.frame = CGRectMake(_x, 8, 10, 12);
}”

CGFloat adScale   = newsData.FHEIGHT / newsData.FWIDTH;
if (isnan(adScale)) {
   adScale = 0;
}

二 : 為空的判斷

在開發(fā)中,會遇到很多空的情況筷登,有時候取得對象(null),還有時候會得到<null>的情況剃根,我們需要判斷是否為空,進行return前方;
id result;

針對(nil)這種情況
if(result == nil) return;

針對<null>的情況
if([result isEqual:[NSNull null]]) return;

前者的判斷跟继,我們用的比較頻繁种冬,但后者,用的比較少舔糖,一般賦值給nil之外的其他空值娱两;

基本數(shù)據(jù)類型的空值判斷:

(1)對于類似于NSString類型的數(shù)據(jù)進行空值判斷
NSString *string;
1、string == nil;
2金吗、[string isEqualToString:@""];

(2)對于類似于NSNumber類型的數(shù)據(jù)進行空值判斷
NSNumber *number;
1十兢、number == nil;
2、[number isEqualToNumber:@0]

(3)對于類似于NSArray類型的數(shù)據(jù)進行空值判斷
NSArray *array;
1摇庙、array == nil;
2旱物、array.count = 0;

(4)對于類似于NSDictionary類型的數(shù)據(jù)進行空值判斷
NSDictionary *dictionary;
1、[dictionary isEqual:[NSNull null]];
2卫袒、dictionary.count = 0;

(5)對于對象類型的數(shù)據(jù)進行空值判斷
可以使用 !(非) 來判斷
if(宵呛!class) return;

(9)abs/fabs/fabsf等

abs 絕對值

int abs(int i); // 處理int類型的取絕對值

fabs 絕對值

double fabs(double i); //處理double類型的取絕對值

fabsf 絕對值

float fabsf(float i); /處理float類型的取絕對值

ceilf 進位方法

float numberToRound;
int result;
numberToRound = 5.61;
result = (int)ceilf(numberToRound);
NSLog(@"ceilf(%.2f) = %d", numberToRound, result);
//輸出 ceilf(5.61) = 6

numberToRound = 5.41;
result = (int)ceilf(numberToRound);
NSLog(@"ceilf(%.2f) = %d", numberToRound, result);
//輸出 ceilf(5.41) = 6

roundf 四舍五入

float numberToRound;
int result;
numberToRound = 5.61;
result = (int)roundf(numberToRound);
NSLog(@"roundf(%.2f) = %d", numberToRound, result);
//輸出 roundf(5.61) = 6

numberToRound = 5.41;
result = (int)roundf(numberToRound);
NSLog(@"roundf(%.2f) = %d", numberToRound, result);
//輸出 roundf(5.41) = 5

floorf 模位方法

float numberToRound;
int result;
numberToRound = 5.61;
result = (int)floorf(numberToRound);
NSLog(@"floorf(%.2f) = %d", numberToRound, result);
//輸出 floorf(5.61) = 5

numberToRound = 5.41;
result = (int)floorf(numberToRound);
NSLog(@"floorf(%.2f) = %d", numberToRound, result);
//輸出 floorf(5.41) = 5

(10)NSString格式化輸出

格式:

%@ 對象

%d, %i 整數(shù)

%u 無符整形

%f 浮點/雙字

%x, %X 二進制整數(shù)

%o 八進制整數(shù)

%zu size_t

%p 指針

%e 浮點/雙字 (科學(xué)計算)

%g 浮點/雙字

%s C 字符串

%.*s Pascal字符串

%c 字符

%C unichar

%lld 64位長整數(shù)(long long)

%llu 無符64位長整數(shù)

%Lf 64位雙字

文檔

表1: NSString格式化方法和CFString格式化函數(shù)支持的格式說明符定義說明

%@

Objective-C對象,打印為descriptionWithLocale返回的字符串:如果可用夕凝,或其他描述宝穗。也適用于CFTypeRef對象,返回CFCopyDescription函數(shù)的結(jié)果码秉。

%%

'%'字符

%d逮矛,%D,%i

有符號32位整數(shù)(int)

%u转砖,%U

無符號32位整數(shù)(unsigned int)

%hi

有符號16位整數(shù)(短)

%hu

無符號16位整數(shù)(無符號短整數(shù))

%qi

簽名64位整數(shù)(long long)

%qu

無符號64位整數(shù)(unsigned long long)

%x

無符號32位整數(shù)(unsigned int)须鼎,使用數(shù)字0-9和小寫a-f以十六進制打印

%X

無符號32位整數(shù)(unsigned int),使用數(shù)字0-9和大寫A-F以十六進制打印

%qx

無符號64位整數(shù)(無符號長long)府蔗,使用數(shù)字0-9和小寫a-f以十六進制打印

%qX

無符號64位整數(shù)(無符號長long)晋控,使用數(shù)字0-9和大寫A-F以十六進制打印

%o,%O

無符號32位整數(shù)(unsigned int)姓赤,以八進制打印

%f

64位浮點數(shù)(雙精度)

%e

64位浮點數(shù)(雙精度)糖荒,使用小寫e以科學(xué)計數(shù)法打印以引入指數(shù)

%E

64位浮點數(shù)(雙精度數(shù)),用科學(xué)計數(shù)法打印模捂,使用大寫E表示指數(shù)

%g

64位浮點數(shù)(double),如果指數(shù)小于-4或大于或等于精度蜘矢,則以%e的樣式打印狂男,格式為%f否則

%G

64位浮點數(shù)(雙精度),如果指數(shù)小于-4或大于或等于精度品腹,則以%E的樣式打印岖食,格式為%f否則

%c

8位無符號字符(unsigned char),由NSLog()作為ASCII字符打印舞吭,如果不是ASCII字符泡垃,則以八進制格式\ ddd或Unicode十六進制格式\ udddd打印析珊,其中d為a數(shù)字

%C

16位Unicode字符(unichar),由NSLog()作為ASCII字符打印蔑穴,或者忠寻,如果不是ASCII字符,則以八進制格式\ ddd或Unicode十六進制格式\ udddd打印存和,其中d是數(shù)字

%s

以空值終止的8位無符號字符數(shù)組奕剃。 %s以系統(tǒng)編碼解釋其輸入,而不是例如UTF-8捐腿。

%S

以16位Unicode字符為單位的空終止數(shù)組

%p

Void指針(void *)纵朋,以十六進制打印,數(shù)字為0-9茄袖,小寫字母為a-f操软,前導(dǎo)0x

%L

長度修飾符指定后續(xù)的a,A宪祥,e聂薪,E,f品山,F(xiàn)胆建,g或G轉(zhuǎn)換說明符適用于long double參數(shù)

%a

64位浮點數(shù)(雙精度),用科學(xué)計數(shù)法打印肘交,帶小數(shù)點前面的前導(dǎo)0x和一個十六進制數(shù)字笆载,使用小寫p引入指數(shù)

%A

一個64位浮點數(shù)(雙精度數(shù)),用科學(xué)計數(shù)法打印涯呻,在小數(shù)點前有一個前導(dǎo)0X和一個十六進制數(shù)字凉驻,用大寫字母P來表示指數(shù)

%F

64位浮點數(shù)(雙精度),以十進制表示法打印

%z

長度修飾符复罐,指定后續(xù)的d涝登,i,o效诅,u胀滚,x或X轉(zhuǎn)換說明符適用于size_t或相應(yīng)的有符號整數(shù)類型參數(shù)

%t

Length修飾符,指定后續(xù)的d乱投,i咽笼,o,u戚炫,x或X轉(zhuǎn)換說明符適用于ptrdiff_t或相應(yīng)的無符號整數(shù)類型參數(shù)

%j

長度修飾符剑刑,指定后續(xù)的d,i,o施掏,u钮惠,x或X轉(zhuǎn)換說明符適用于intmax_t或uintmax_t參數(shù)

平臺依賴
Mac OS X使用多種數(shù)據(jù)類型-NSInteger,NSUInteger七芭,CGFloat和CFIndex-來提供在32位和64位環(huán)境中表示值的一致方法素挽。在32位環(huán)境中,NSInteger和NSUInteger分別定義為int和unsigned int抖苦。在64位環(huán)境中毁菱,NSInteger和NSUInteger分別定義為long和unsigned long。為了避免根據(jù)平臺使用不同的printf樣式類型說明符锌历,可以使用表2中所示的說明符贮庞。請注意,在某些情況下究西,您可能必須轉(zhuǎn)換值窗慎。

表2: 數(shù)據(jù)類型的格式說明符類型定義建議

NSInteger

%ld或%lx
將值強制轉(zhuǎn)換為long

NSUInteger

%lu或%lx
將值轉(zhuǎn)換為unsigned long

CGFloat

%f或%g%f
適用于格式化時的浮點數(shù)和雙精度數(shù);但掃描時請看下面的警告

CFIndex

%ld或%lx
與NSInteger相同

pointer

%p
%p將0x添加到輸出的開頭。如果您不想這樣卤材,請使用%lx并強制轉(zhuǎn)換為long遮斥。

long long

%lld或%llx
long long在32位和64位平臺上都是64位
在32位和64位平臺上,

unsigned long long

%llu或%llx
unsigned long long是64位

以下示例說明了使用%ld格式化NSInteger和使用強制轉(zhuǎn)換扇丛。

NSInteger i = 42;
printf(“%ld \ n”术吗,(long)i);

除了表2中提到的注意事項外,還有一個額外的掃描案例:您必須區(qū)分float和double的類型帆精。你應(yīng)該使用%f表示float较屿,%lf表示double。如果你需要使用scanf(或那里的變種)

示例:

1.不足幾位前補0

%02表示不足2位補0

int   hour  =  4;
endHour.text  =  [NSString stringWithFormat:@"%02d",hour];
//結(jié)果是04

2.小數(shù)保留位數(shù)

.2f表示要保留小數(shù)位數(shù)

float   hour  =  4.12345;
endHour.text  =  [NSString stringWithFormat:@"%.2f",hour];
//結(jié)果是4.12

(11)集合類

在Objective-C中的集合類中主要包括不可變的數(shù)組–NSArray, 可變的數(shù)組–NSMutableArray, 不可變的字典–NSDictionary, 可變的字典–NSMutableDictionary, 不可變的集合–NSSet卓练,可變的集合–NSMutableSet隘蝎。

一、數(shù)組

1.不可變的數(shù)組 NSArray

數(shù)組是有序?qū)ο蟮募辖笃螅脕泶鎯ο蟮挠行蛄斜碇雒矗贠C中數(shù)組中必須存的是對象,不能是基本數(shù)據(jù)類型顽悼,若想存入基本數(shù)據(jù)類型曼振,必須先把數(shù)據(jù)類型轉(zhuǎn)換成對象,然后再存入集合類中蔚龙。 NSArray也是OC中的一個對象冰评,使用NSArray也需要進行實例化,前面的博客在類的初始化中提到了便利初始化函數(shù)和便利構(gòu)造器府蛇,在NSArray中也少不了這兩樣?xùn)|西我們可以通過NSArray的便利初始化函數(shù)或者便利構(gòu)造器進行NSArray的實例化和初始化工作。

(1)NSArray的初始化

NSArray的便利初始化函數(shù): -(id) initWithObjects : (id) firstObject, ….;

NSArray的便利構(gòu)造器: +(id) arrayWithObjects: (id) firstObject, …;

demo:

//NSArray的便利初始化
NSArray *array1 = [[NSArray alloc] initWithObjects:@"aaa", @"bbb", @"ccc", nil];
//NSArray的便利構(gòu)造器
NSArray *array2 = [NSArray arrayWithObjects:@"111", @"222", @"333", nil];

(2)獲取數(shù)組元素的個數(shù)和數(shù)組的元素

-(NSUInteger) count; 獲取數(shù)組元素的個數(shù)

-(id) objectAtIndex : (NSUInteger) index;

demo:

//獲取數(shù)組元素的個數(shù)和元素
int count = (int)[array1 count];
//獲取相應(yīng)索引的元素
id element = [array1 objectAtIndex:0];
NSLog(@"array1_count = %d, array[0] = %@", count, element);

//獲取數(shù)組元素的個數(shù)和元素
int count = (int)[array1 count];
//獲取相應(yīng)索引的元素
id element = [array1 objectAtIndex:0];
NSLog(@"array1_count = %d, array[0] = %@", count, element);

運行結(jié)果:
Objective-C
2014-08-01 16:25:37.117 HelloOC[1285:303] array1_count = 3, array[0] = aaa
1

2014-08-01 16:25:37.117 HelloOC[1285:303] array1_count = 3, array[0] = aaa

(3)有了count和objectAtIndex我們就可以對數(shù)組進行元素的遍歷啦

demo:

//封裝遍歷數(shù)組的函數(shù)
void array_display(id array)
{
    for (int i = 0 ; i
        id temp = [array objectAtIndex:i];
        NSLog(@"%@", temp);
    }
}

2.可變數(shù)組:NSMutableArray

NSArray的容量是固定的屿愚,而NSMutableArray的容量是可變的汇跨,我們可以在NSMutableArray實例化的時候先初始化一個容量务荆,不過這個容量不是固定的,不夠的時候會自動增加穷遂。NSMutableArray是NSArray的子類函匕,是對NSArray的一個擴充。

(1) NSMutableArray的初始化

NSMutableArray的便利初始化函數(shù):-(id) initWithCapacity : (NSUInteger) numItems;

NSMutableArray的便利構(gòu)造器:+(id) arrayWithCapacity: (NSUInteger) numItems;

demo:
Objective-C

//NSMutableArray的便利初始化
NSMutableArray *array3 = [[NSMutableArray alloc] initWithCapacity:3];
//NSMutableArray的便利構(gòu)造器
NSMutableArray *array4 = [NSMutableArray arrayWithCapacity:3];

(2)元素的添加和刪除

增加元素: -(void) addObject: (id) anObject; –往數(shù)組的尾部添加元素

刪除全部內(nèi)容: -(void) removeAllObjects;

刪除最后一個元素: -(void) removeLastObject;

通過索引刪除元素: -(void) removeObjectAtIndex: (NSUInteger) index;

刪除任意一個元素: -(void) removeObject : (id)object;

代碼如下:
Objective-C

//初始化NSMutableArray
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil];
//添加元素
[array addObject:@"444"];

//移除元素
[array removeObject:@"111"];

//移除最后一個元素
[array removeLastObject];

//按照索引刪除元素
[array removeObjectAtIndex:0];

array_display(array);

運行結(jié)果:
Objective-C
2014-08-01 17:18:58.658 HelloOC[1467:303] 333
1

2014-08-01 17:18:58.658 HelloOC[1467:303] 333

(3)元素的插入和替換

通過數(shù)組的索引來進行元素的替換:-(void) replaceObjectAtIndex :(NSUInteger) index withObject: (id) anObject;

在指定索引處插入對象:-(void) insertObject : (id) anObject atIndex : (NSUInteger) index;

demo:
Objective-C

//初始化NSMutableArray
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"111", @"222", @"333", nil];

//對指定位置的元素進行替換
[array replaceObjectAtIndex:0 withObject:@"aaa"];

//在相應(yīng)的位置插入元素
[array insertObject:@"bbb" atIndex:1];

array_display(array);

運行結(jié)果:
Objective-C
2014-08-01 17:44:20.769 HelloOC[1520:303] aaa
2014-08-01 17:44:20.769 HelloOC[1520:303] bbb
2014-08-01 17:44:20.770 HelloOC[1520:303] 222
2014-08-01 17:44:20.770 HelloOC[1520:303] 333

4.數(shù)組的遍歷

上面已經(jīng)寫了一種數(shù)組遍歷方式蚪黑,下面總結(jié)了其他的遍歷方式盅惜,用枚舉器(類似Java中的迭代器)和快速枚舉(類似PHP中的foreach)

(1)枚舉器(迭代器)的用法

要通過NSEnumerator來遍歷數(shù)組首先得通過-(NSEnumerator *) objectEnumerator來得到枚舉器;通過枚舉其中的nextObject來獲取對象

demo:如下
Objective-C

//迭代遍歷數(shù)組
//獲取枚舉器
NSEnumerator *enumerator = [array objectEnumerator];
//臨時變量
id obj;
while (obj = [enumerator nextObject]) {
    NSLog(@"%@", obj);
}

(2)快速遍歷法忌穿,相當于PHP中的foreach的用法
Objective-C

for(id obj in array)
{
    NSLog(@"%@", obj);
}

5.對可變數(shù)組進行排序
Objective-C

//對數(shù)組進行排序
[arraymul sortUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2)
{
    if ([obj1 compare:obj2] 0)
    {
        NSLog(@"交換");
        return 1;
    }
    else
    {
        NSLog(@"不交換");
        return -1;
    }
}];

二抒寂、字典(Dictionary)

字典就像java中的Map, 里面存的是鍵值對,key的值是不可以重復(fù)的掠剑。字典有可改變的和不和不可改變之分

1.不可變字典NSDictionary

(1)字典的創(chuàng)建和獲取字典的值
Objective-C

//不可變字典的初始化
NSDictionary *dictionay = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
id value = [dictionay objectForKey:@"key1"];
NSLog(@"key1 => %@", value);

代碼運行結(jié)果:
Objective-C
2014-08-01 19:09:41.319 HelloOC[1658:303] key1 => value1

(2).字典的遍歷

字典的遍歷方法是通過字典里的-(NSArray *)allKeys獲取所有的key存入數(shù)組中然后通過遍歷數(shù)組獲取key對應(yīng)的value,封裝成函數(shù)如下:
Objective-C

//封裝遍歷字典的函數(shù)
void dictionary_display(id dictionay)
{
    NSArray *keys = [dictionay allKeys];
    for (id obj in keys) {
        NSLog(@"%@ => %@", obj, [dictionay objectForKey:obj]);
    }
}

2.可變字典NSMutableDictionary

在使用可變字典NSMutableDictionary時可以先給可變字典初始化一個空間屈芜,如果不夠的話會自動增加

給可變字典分配初始化空間: +(id) dictionaryWithCapacity : (NSUInteger) num;

給可變字典添加對象:-(void) setObject(id) obj forKey(id) aKey;

根據(jù)關(guān)鍵字刪除對象:-(void) removeObjectForKey : (id) aKey;

刪除字典中的所有數(shù)據(jù): -(void) removeAllObjects;

代碼如下:
Objective-C

NSMutableDictionary *mulDictionary = [NSMutableDictionary dictionaryWithCapacity:3];
//添加值
[mulDictionary setObject:@"value1" forKey:@"key1"];
[mulDictionary setObject:@"value2" forKey:@"key2"];
[mulDictionary setObject:@"value3" forKey:@"key3"];
[mulDictionary setObject:@"value4" forKey:@"key4"];
//通過鍵刪除值
[mulDictionary removeObjectForKey:@"key4"];
dictionary_display(mulDictionary);

運行結(jié)果:
Objective-C
2014-08-01 20:28:37.504 HelloOC[1786:303] key3 => value3
2014-08-01 20:28:37.504 HelloOC[1786:303] key1 => value1
2014-08-01 20:28:37.504 HelloOC[1786:303] key2 => value2

三.Set集合

?Set集合類就像我們數(shù)學(xué)中的集合一樣是無序和不重復(fù)的,Set中也只能存放對象朴译,也分為可變集合NSMutableSet和不可變集合NSSet井佑。

?####1.不可變集合NSSet

?(1)NSSet的初始化和其他集合類一樣也有其對應(yīng)的便利初始化方法和便利構(gòu)造器,

?便利初始化方法:-(id) initWithObjects: (id) firstObject, …;

?便利構(gòu)造器:+(id) setWithObjects: (id) firstObject, …;

?(2)NSSet中也有-(NSUInteger) count 來獲取元素的對象

?(3) 獲取集合中的元素

?獲取全部的集合元素眠寿,以數(shù)組的形式返回:-(NSArray *) allObjects;

?隨進獲取集合中的元素:-(id) anyObject;

?(4)判斷兩個Set是否相同 : – (BOOL) isEqualToSet: (NSSet *) otherSet;

?(5)判斷一個元素是否在本集合中 -(BOOL) member: (id) obj;

?
Demo: ?
Objective-C

//set集合的操作
//便利初始化函數(shù)
NSSet *set1 = [[NSSet alloc] initWithObjects:@"aa", @"bb", @"cc", @"dd", nil];
//便利構(gòu)造器
NSSet *set2 = [NSSet setWithObjects:@"AA", @"BB", @"CC", nil];

//獲取集合中元素的個數(shù)
int count = (int) [set1 count];
NSLog(@"set1里面的元素的個數(shù)為:%d", count);

//遍歷集合:把set集合轉(zhuǎn)換為數(shù)組然后進行遍歷
NSArray *setToArray = [set2 allObjects];
array_display(setToArray);

//隨機獲取Set中元素
id element = [set1 anyObject];
NSLog(@"隨機獲取其中的值%@", element);

//比較兩個Set是否相等
if ([set1 isEqualToSet:set2] == NO) {
    NSLog(@"set1 != set2");
}

//查看一個元素是否在一個set中
if ([set1 member:@"aa"]) {
    NSLog(@"aa 在set1中");
}

?運行結(jié)果為:
Objective-C
2014-08-02 09:47:39.554 HelloOC[608:303] set1里面的元素的個數(shù)為:4
2014-08-02 09:47:39.555 HelloOC[608:303] CC
2014-08-02 09:47:39.555 HelloOC[608:303] AA
2014-08-02 09:47:39.555 HelloOC[608:303] BB
2014-08-02 09:47:39.555 HelloOC[608:303] 隨機獲取其中的值cc
2014-08-02 09:47:39.556 HelloOC[608:303] set1 != set2
2014-08-02 09:47:39.556 HelloOC[608:303] aa 在set1中

?2躬翁、可變Set: NSMutableSet

?1.可變集合的實例化和初始化

?便利初始化函數(shù): -(id) initWithCapacity :(NSUInteger) numItems;

?便利構(gòu)造器:+(id) setWithCapacity: (NSUInteger) numItems;

?2.往可變集合中添加元素

?-(void) addObject : (id) object;

?3.刪除集合中的對象

?-(void) removeAllObjects; 刪除所有的對象;

?-(void) removeObjects: (id) object 刪除其中某一個對象盯拱;

?
demo:
Objective-C

//set可變集合
//便利初始化函數(shù)分配大小
NSMutableSet *mutableSet1 = [[NSMutableSet alloc] initWithCapacity:3];
NSMutableSet *mutableSet2 = [NSMutableSet setWithCapacity:3];

//添加元素
[mutableSet1 addObject:@"aaa"];
[mutableSet1 addObject:@"BBB"];
[mutableSet1 addObject:@"bbb"];

//刪除元素
[mutableSet1 removeObject:@"BBB"];

//遍歷Set
NSArray *setArray = [mutableSet1 allObjects];
array_display(setArray);

? ?運行結(jié)果:
Objective-C
2014-08-02 10:18:34.844 HelloOC[701:303] aaa
2014-08-02 10:18:34.844 HelloOC[701:303] bbb

四:把基本數(shù)據(jù)類型包裝成對象

? ?前面不止一次的提到在OC中的集合類中是不能放基本數(shù)據(jù)類型的盒发,那么我們?nèi)绾伟鸦緮?shù)據(jù)類型封裝成對象呢? 在OC中給我們提供啦一個類專門來把基本數(shù)據(jù)類型封裝成對象坟乾,這個類就是NSNumber.

? ? ?1. NSNumber的用法如下

?    ?    ?    ?把基本類型包裝成對象的便利構(gòu)造函數(shù)

?    ?    ?    ?    ?-(id) initWithChar : (char) value;

?    ?    ?    ?    ?-(id) initWithInt : (int) value;

?    ?    ?    ?    ?-(id) initWithFloat : (float) value;

?    ?    ?    ?    ?-(id) initWithBool: (BOOL) value;

?    ?    ?    ?把基本數(shù)據(jù)類型包裝成對象的便利構(gòu)造器

?    ?    ?    ?    ?+(id) numberWithChar : (char) value;

?    ?    ?    ?    ?+(id) numberWithInt : (int) value;

?    ?    ?    ?    ?+(id) numberWithFloat : (float) value;

?    ?    ?    ?    ?+(id) numberWithBool : (BOOL) value;

?    ?    ?    ?從NSNumber中獲取值

?    ?    ?    ?    ?-(char) charValue;    ?    ?-(int) intValue;      ?-(float) floatValue;    ? (BOOL) boolValue;    ?(NSString *) stringValue;

?2迹辐、在集合類中是不可以存儲nil(空的),因為nil作為nil的結(jié)束符甚侣,那么我們?nèi)绾蝸泶鎯諏ο竽孛鞣裕吭揘SNull出場啦,其功能是把null包裝成對象.

? ? ? ? ?+(NSNull *) null;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殷费,一起剝皮案震驚了整個濱河市印荔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌详羡,老刑警劉巖仍律,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異实柠,居然都是意外死亡水泉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來草则,“玉大人钢拧,你說我怎么就攤上這事】缓幔” “怎么了源内?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長份殿。 經(jīng)常有香客問我膜钓,道長,這世上最難降的妖魔是什么卿嘲? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任颂斜,我火速辦了婚禮,結(jié)果婚禮上腔寡,老公的妹妹穿的比我還像新娘焚鲜。我一直安慰自己,他們只是感情好放前,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布忿磅。 她就那樣靜靜地躺著,像睡著了一般凭语。 火紅的嫁衣襯著肌膚如雪葱她。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天似扔,我揣著相機與錄音吨些,去河邊找鬼。 笑死炒辉,一個胖子當著我的面吹牛豪墅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播黔寇,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼偶器,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缝裤?” 一聲冷哼從身側(cè)響起屏轰,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憋飞,沒想到半個月后霎苗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡榛做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年唁盏,在試婚紗的時候發(fā)現(xiàn)自己被綠了内狸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡厘擂,死狀恐怖答倡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驴党,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布获茬,位于F島的核電站港庄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恕曲。R本人自食惡果不足惜鹏氧,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佩谣。 院中可真熱鬧把还,春花似錦、人聲如沸茸俭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调鬓。三九已至艇炎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腾窝,已是汗流浹背缀踪。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虹脯,地道東北人驴娃。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像循集,于是被迫代替她去往敵國和親唇敞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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