美文网首页
Type Encodings

Type Encodings

作者: skogt | 来源:发表于2019-06-20 21:52 被阅读0次

@encode@编译器指令 之一,返回一个给定类型编码为一种内部表示的字符串(例如,@encode(int)i),类似于 ANSI C 的 typeof 操作。苹果的 Objective-C 运行时库内部利用类型编码帮助加快消息分发。

Objective-C type encodings

编码 意义
c A char
i An int
s A short
l A long l 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)));

结果:

类型 编码
int i
float f
float * ^f
char c
char * *
BOOL c
void v
void * ^v
NSObject * @
NSObject #
[NSObject] {NSObject=#}
NSError ** ^@
int[] [5i]
float[] [3f]
struct {_struct=sqQ}

这里有一些特别需要注意的:

  • 指针的标准编码是加一个前置的 ^,而 char * 拥有自己的编码 *。这在概念上是很好理解的,因为 C 的字符串被认为是一个实体,而不是指针。
  • BOOLc,而不是某些人以为的 i。原因是 charint 小,且在 80 年代 Objective-C 最开始设计的时候,每一个 bit 位都比今天的要值钱(就像美元一样)。BOOL 更确切地说是 signed char (即使设置了 -funsigned-char 参数),以在不同编译器之间保持一致,因为 char 可以是 signed 或者 unsigned
  • 直接传入 NSObject 将产生 #。但是传入 [NSObject class] 产生一个名为 NSObject 只有一个类字段的结构体。很明显,那就是 isa 字段,所有的 NSObject 实例都用它来表示自己的类型。

方法编码

如苹果的 “Objective-C Runtime Programming Guide” 中所提到的,有一大把内部使用的类型编码无法用 @encode() 返回。

以下是协议中声明的方法的类型修饰符:

Objective-C Method Encodings

编码 意义
r const
n in
N inout
o out
O bycopy
R byref
V oneway

对于那些熟悉 NSDistantObject 的人,你无疑会认出这些是 Distributed Objects 的残留。

参考:
https://nshipster.cn/type-encodings/
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100

相关文章

  • iOS 的Type Encodings

    iOS 的Type Encodings Type Encodings compiler 编码encode 每个me...

  • iOS 类型编码(Type Encodings)

    Type Encodings

  • Type Encodings

    Type Encodings Apple Type Encodings 就是编译器把 method 的参数列表和返...

  • Type Encodings

    为了帮助运行时系统,编译器将每个方法中的返回值类型和参数类型进行编码,并将方法名和方法选择器进行关联。编译器通过@...

  • Type Encodings

    @encode,@编译器指令 之一,返回一个给定类型编码为一种内部表示的字符串(例如,@encode(int) →...

  • Type Encodings

    Type Encodings 在使用消息转发的时候,我们经常会用到到这个方法methodSignatureForS...

  • Runtime:Type Encodings

    序言:编译器把每个方法的返回类型和参数类型编码成跟该方法相关联的字符,同时编码器也对外提供了获取相应编码字符的指令...

  • Type Encodings 、NSMethodSignatur

    前言 一般来说,写东西都是由上而下顶层联想,由于这次是知识总结,准备从浅入深,一点一点写下去。文章段落之间好想关系...

  • Runtime - Method

    参考文档 Type Encodings[https://developer.apple.com/library/a...

  • Runtime(四) 函数返回值和参数类型编码

    Type Encodings 为了协助(assist)runtime system,编译器(compiler)会把...

网友评论

      本文标题:Type Encodings

      本文链接:https://www.haomeiwen.com/subject/yndsqctx.html