iOS - NSValue 與 @encode


一恃轩、NSValue 很有用的包裝對(duì)象的兩個(gè)用法

    NSData*data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];
    /** 用 NSValue 包裝 Objective-C 對(duì)象 */
    NSValue *value = [NSValue valueWithBytes:&data objCType:@encode(NSString)];
    NSLog(@"%@",value);
    /** NSValue 創(chuàng)建并返還一個(gè)包含給定對(duì)象的  */
    NSObject*objc = [NSObject new];
    NSValue * value2 = [NSValue valueWithNonretainedObject:objc];
    NSLog(@"%@",value2);

二、關(guān)于 @encode

  • 意義:@編譯器指令 之一叉跛,返回一個(gè)給定類型編碼為一種內(nèi)部表示的字符串(例如,@encode(int) → i)鸣峭,類似于 ANSI C 的 typeof 操作酥艳。蘋果的 Objective-C 運(yùn)行時(shí)庫(runtime)內(nèi)部利用類型編碼幫助加快消息分發(fā)。
                           Objective-C Type Encodings
 編碼             意義
 c             --->    A char
 i              --->   An int
 s              --->   A short
 l              --->   A longl is treated as a 32-bit quantity on 64-bit programs.
 q              --->   A long long
 C             --->    An unsigned char
 I              --->   An unsigned int
 S             --->    An unsigned short
 L              --->   An unsigned long
 Q             --->    An unsigned long long
 f              --->   A float
 d              --->   A double
 B              --->   A C++ bool or a C99 _Bool
 v              --->   A void
 "*             --->    A character string (char *)(最前方的”是為了格式才添加)
 @            --->     An object (whether statically typed or typed id)
 "#            --->   A class object (Class)(最前方的“是為了格式才添加)
 :             --->    A method selector (SEL)
 [array type]   --->   An array
 {name=type...} --->   A structure
 (name=type...) --->   A union
 bnum           --->   A bit field of num bits
 ^type          --->   A pointer to type
 ?             --->    An unknown type (among other things, this code is used for function pointers)
  • 我們也可以嘗試去打印這些值
    NSLog(@"int        : %s", @encode(int));
    NSLog(@"float      : %s", @encode(float));
    NSLog(@"float *    : %s", @encode(float*));
    NSLog(@"char       : %s", @encode(char));
    NSLog(@"char *     : %s", @encode(char *));
    NSLog(@"BOOL       : %s", @encode(BOOL));
    NSLog(@"void       : %s", @encode(void));
    NSLog(@"void *     : %s", @encode(void *));
    
    NSLog(@"NSObject * : %s", @encode(NSObject *));
    NSLog(@"NSObject   : %s", @encode(NSObject));
    NSLog(@"[NSObject] : %s", @encode(typeof([NSObject class])));
    NSLog(@"NSError ** : %s", @encode(typeof(NSError **)));
    
    int intArray[5] = {1, 2, 3, 4, 5};
    NSLog(@"int[]      : %s", @encode(typeof(intArray)));
    
    float floatArray[3] = {0.1f, 0.2f, 0.3f};
    NSLog(@"float[]    : %s", @encode(typeof(floatArray)));
    
    typedef struct _struct {
        short a;
        long long b;
        unsigned long long c;
    } Struct;
    NSLog(@"struct     : %s", @encode(typeof(Struct)));
  • Method Ecoding


    MethodEcoding.png
  • 這里有需要注意的是:
    • 指針的標(biāo)準(zhǔn)編碼是加一個(gè)前置的 ^,而 char * 擁有自己的編碼 *赫冬。這在概念上是很好理解的,因?yàn)?C 的字符串被認(rèn)為是一個(gè)實(shí)體膛薛,而不是指針补鼻。
    • BOOL 是 c哄啄,而不是某些人以為的 i风范。原因是 char 比 int 小,且在 80 年代 Objective-C 最開始設(shè)計(jì)的時(shí)候锌半,每一個(gè) bit 位都比今天的要值錢(就像美元一樣)寇漫。BOOL 更確切地說是 signed char (即使設(shè)置了 -funsigned-char 參數(shù))刊殉,以在不同編譯器之間保持一致州胳,因?yàn)?char 可以是 signed 或者 unsigned。
    • 直接傳入 NSObject 將產(chǎn)生 #遍膜。但是傳入 [NSObject class] 產(chǎn)生一個(gè)名為 NSObject 只有一個(gè)類字段的結(jié)構(gòu)體。很明顯瓢颅,那就是 isa 字段,所有的 NSObject 實(shí)例都用它來表示自己的類型惜索。

文章來源


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巾兆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子角塑,更是在濱河造成了極大的恐慌,老刑警劉巖圃伶,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窒朋,死亡現(xiàn)場離奇詭異,居然都是意外死亡侥猩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門唧取,熙熙樓的掌柜王于貴愁眉苦臉地迎上來划提,“玉大人,你說我怎么就攤上這事鹏往。” “怎么了伊履?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我奠货,道長,這世上最難降的妖魔是什么柔滔? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮睛廊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咆霜。我一直安慰自己嘶朱,他們只是感情好蛾坯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布脉课。 她就那樣靜靜地躺著,像睡著了一般倘零。 火紅的嫁衣襯著肌膚如雪戳寸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天庆揩,我揣著相機(jī)與錄音,去河邊找鬼虏辫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砌庄,可吹牛的內(nèi)容都是我干的奕枢。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼缝彬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扒俯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤撼玄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盏浙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡废膘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年殖卑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵稽。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡十偶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惦积,到底是詐尸還是另有隱情,我是刑警寧澤狮崩,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布睦柴,位于F島的核電站诽凌,受9級(jí)特大地震影響坦敌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狱窘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一蘸炸、第九天 我趴在偏房一處隱蔽的房頂上張望躬络。 院中可真熱鬧搭儒,春花似錦越锈、人聲如沸膘滨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽德撬。三九已至,卻和暖如春蜓洪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隆檀。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國打工恐仑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泉坐,地道東北人裳仆。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纯丸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子觉鼻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

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