美文网首页
iOS @encode 使用

iOS @encode 使用

作者: yulekwok | 来源:发表于2019-08-06 23:43 被阅读0次

iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码

苹果官网的链接地址

demo地址

To assist the runtime system, the compiler encodes the return and argument types for each method in a character string and associates the string with the method selector. The coding scheme it uses is also useful in other contexts and so is made publicly available with the @encode() compiler directive. When given a type specification, @encode() returns a string encoding that type. The type can be a basic type such as an int, a pointer, a tagged structure or union, or a class name—any type, in fact, that can be used as an argument to the C sizeof() operator.

为了帮助运行时系统,编译器将每个方法的返回和参数类型编码为字符串,并将该字符串与方法选择器关联。 它使用的编码方案在其他上下文中也很有用,因此可以通过@encode()编译器指令公开使用。 给定类型说明后,@ encode()返回编码该类型的字符串。 该类型可以是基本类型,例如int,指针,带标签的结构或联合或类名-实际上可以用作C sizeof()运算符的参数的任何类型。

char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);
Code Meaning
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)

Important: Objective-C does not support the long double type. @encode(long double) returns d, which is the same encoding as for double.

重要:Objective-C不支持long double类型。 @encode(long double)返回d,该编码与double相同。

- (void)viewDidLoad {
    [super viewDidLoad];
    #define NSLog(FORMAT, ...) fprintf(stderr, "%s\n", [[NSString stringWithFormat:FORMAT, ## __VA_ARGS__] UTF8String]);
    NSString *format = @"\t";
    NSLog(@"@encode(char)%@ %s", format, @encode(char));
    NSLog(@"@encode(int)%@ %s", format, @encode(int));
    NSLog(@"@encode(long)%@ %s", format, @encode(long));
    NSLog(@"@encode(long long)%@ %s", format, @encode(long long));
    NSLog(@"@encode(unsigned char)%@ %s", format, @encode(unsigned char));
    NSLog(@"@encode(unsigned int)%@ %s", format, @encode(unsigned int));
    NSLog(@"@encode(unsigned short)%@ %s", format, @encode(unsigned short));
    NSLog(@"@encode(unsigned long)%@ %s", format, @encode(unsigned long));
    NSLog(@"@encode(unsigned long long)%@ %s", format, @encode(unsigned long long));
    NSLog(@"@encode(float)%@ %s", format, @encode(float));
    NSLog(@"@encode(float *)%@ %s", format, @encode(float *));
    NSLog(@"@encode(double)%@ %s", format, @encode(double));
    NSLog(@"@encode(double *)%@ %s", format, @encode(double *));
    NSLog(@"@encode(BOOL)%@ %s", format, @encode(BOOL));
    NSLog(@"@encode(void)%@ %s", format, @encode(void));
    NSLog(@"@encode(void *)%@ %s", format, @encode(void *));
    NSLog(@"@encode(char *)%@ %s", format, @encode(char *));
    NSLog(@"@encode(NSObject)%@ %s", format, @encode(NSObject));
    NSLog(@"@encode(NSObject *)%@ %s", format, @encode(NSObject *));
    NSLog(@"@encode([NSObject class])%@ %s", format, @encode(typeof([NSObject class])));
    NSLog(@"@encode(SEL)%@ %s", format, @encode(typeof(@selector(viewDidLoad))));
    int intArray[3] = { 0, 0, 0 };
    NSLog(@"@encode(intArray)%@ %s", format, @encode(typeof(intArray)));
    float floatArray[3] = { 0.1f, 0.2f, 0.3f };
    NSLog(@"@encode(floatArray)%@ %s", format, @encode(typeof(floatArray)));
    typedef struct _struct {
        short a;
        long long b;
        unsigned long long c;
        double *d;
    } Struct;
    NSLog(@"@encode(Struct)%@ %s", format, @encode(typeof(Struct)));
    //    @interface NSError : NSObject <NSCopying, format,NSSecureCoding> {
    //        @private
    //        void *_reserved;
    //        NSInteger _code;
    //        NSString *_domain;
    //        NSDictionary *_userInfo;
    //    }
    NSLog(@"@encode(NSError)%@ %s", format, @encode(NSError));
    NSLog(@"@encode(NSError ** )%@ %s", format, @encode(typeof(NSError **)));
}

打印结果

@encode(char)    c
@encode(int)     i
@encode(long)    q
@encode(long long)   q
@encode(unsigned char)   C
@encode(unsigned int)    I
@encode(unsigned short)  S
@encode(unsigned long)   Q
@encode(unsigned long long)  Q
@encode(float)   f
@encode(float *)     ^f
@encode(double)  d
@encode(double *)    ^d
@encode(BOOL)    B
@encode(void)    v
@encode(void *)  ^v
@encode(char *)  *
@encode(NSObject)    {NSObject=#}
@encode(NSObject *)  @
@encode([NSObject class])    #
@encode(SEL)     :
@encode(intArray)    [3i]
@encode(floatArray)  [3f]
@encode(Struct)  {_struct=sqQ^d}
@encode(NSError)     {NSError=#^vq@@}
@encode(NSError ** )     ^@

注意:在longlong 和 long 中和苹果官方给的不同 都是 q 不是 l,在unsigned longlong 和unsigned long 中和苹果官方给的不同 都是 Q 不是 L

这是苹果的官网给的解释,由于在工作中用不到,所以我也没有细看
数组的类型代码括在方括号内; 数组中元素的数量是在括号之后,数组类型之前指定的。 例如,由12个指向浮点数的指针组成的数组将编码为:[12^f]

在括号内指定结构,在括号内指定并集。 首先列出结构标签,然后依次列出等号和结构字段的代码。 例如结构

typedef struct example {
    id   anObject;
    char *aString;
    int  anInt;
} Example;

{example=@*i}

The same encoding results whether the defined type name (Example) or the structure tag (example) is passed to @encode(). The encoding for a structure pointer carries the same amount of information about the structure’s fields:

^{example=@*i}
However, another level of indirection removes the internal type specification:

^^{example}
Objects are treated like structures. For example, passing the NSObject class name to @encode() yields this encoding:

{NSObject=#}
The NSObject class declares just one instance variable, isa, of type Class.

Note that although the @encode() directive doesn’t return them, the runtime system uses the additional encodings listed in Table 6-2 for type qualifiers when they’re used to declare methods in a protocol.
6-2

Code Meaning
r const
n in
N inout
o out
O bycopy
bycopy byref
V oneway

相关文章

  • iOS @encode 使用

    iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码 苹果官网的链接地址 demo地址 T...

  • iOS URLEncoder

    //iOS编码转码URLEncoder.encode

  • iOS 使用 NSCharacterSet encode URL

    写在前面 当使用 GET 方式进行网络通信时,参数会作为 URL 的一部分,此时需要对 URL 进行 Percen...

  • iOS encode

    相信大家总会碰到需要encode的时候,接着百度啊,然后发现stringByAddingPercentEscape...

  • iOS 的Type Encodings

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

  • @encode指令(Objective-C Type Encod

    iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码。@encode实际上是编译器指令其中...

  • 2018-03-22 json_encode中文问题

    使用json_encode("json字串",JSON_UNESCAPED_UNICODE);

  • 字符串

    1 .Encode and Decode Strings(271.leetcode) 使用 StringBuild...

  • iOS 转码

    URLEncode iOS 开发中请求访问 Http(s) 时,必须对 URL 进行转码 (Encode),如果是...

  • IOS关于String转UTF8(Unicode)

    在iOS程序访问HTTP资源时需要对URL进行Encode 1.转换为UTF8(ios7 之后的方法) NSStr...

网友评论

      本文标题:iOS @encode 使用

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