国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS NSValue 和 @encode 詳解

2019-11-06 09:43:35
字體:
來源:轉載
供稿:網友

一、NSValue 很有用的包裝對象的兩個用法

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

二、關于 @encode

意義:@編譯器指令 之一,返回一個給定類型編碼為一種內部表示的字符串(例如,@encode(int) → i),類似于 ANSI C 的 typeof 操作。蘋果的 Objective-C 運行時庫(runtime)內部利用類型編碼幫助加快消息分發。

Objective-C Type Encodings

編碼 意義c ---> A chari ---> An ints ---> A shortl ---> A longl is treated as a 32-bit quantity on 64-bit PRograms.q ---> A long longC ---> An unsigned charI ---> An unsigned intS ---> An unsigned shortL ---> An unsigned longQ ---> An unsigned long longf ---> A floatd ---> A doubleB ---> A C++ bool or a C99 _Boolv ---> 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 unionbnum ---> 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 EcodingMethodEcoding.png這里有需要注意的是:指針的標準編碼是加一個前置的 ^,而 char 擁有自己的編碼 。這在概念上是很好理解的,因為 C 的字符串被認為是一個實體,而不是指針。BOOL 是 c,而不是某些人以為的 i。原因是 char 比 int 小,且在 80 年代 Objective-C 最開始設計的時候,每一個 bit 位都比今天的要值錢(就像美元一樣)。BOOL 更確切地說是 signed char (即使設置了 -funsigned-char 參數),以在不同編譯器之間保持一致,因為 char 可以是 signed 或者 unsigned。直接傳入 NSObject 將產生 #。但是傳入 [NSObject class] 產生一個名為 NSObject 只有一個類字段的結構體。很明顯,那就是 isa 字段,所有的 NSObject 實例都用它來表示自己的類型。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 皮山县| 中西区| 墨玉县| 昌邑市| 临洮县| 平阳县| 常熟市| 平乐县| 耿马| 页游| 河间市| 宜阳县| 沅陵县| 兴国县| 浦江县| 正定县| 玉龙| 阳谷县| 崇文区| 马公市| 曲阜市| 沂南县| 阿克苏市| 花垣县| 绵竹市| 婺源县| 安福县| 太和县| 泉州市| 黔西县| 四川省| 枣阳市| 蒙城县| 札达县| 莱芜市| 德昌县| 曲周县| 思南县| 九龙县| 汉寿县| 吴旗县|