什么时候我们应该在目标c

时间:2015-09-03 06:58:31

标签: objective-c pointers runtime

我想知道我们何时应该在目标c中使用二维指针。我读了一篇关于运行时机制的文章。方法objc_msgSend的实现细节如下:

  1. 任何NSObject目标都有isa的属性,该属性将指向相应的Class对象。

    @interface NSObject <NSObject> {
        Class isa  OBJC_ISA_AVAILABILITY;
    }
    
  2. Class目标如下:

    struct objc_class {
        Class isa;  
    
        Class superclass;   
        const char *name;   
        uint32_t version;   
        uint32_t info;        
        uint32_t instance_size;         
        struct old_ivar_list *ivars;    
        struct old_method_list **methodLists;    // Method list of the class
        Cache cache;    
        struct old_protocol_list *protocols;   
    }
    

    我想问的问题是为什么methodLists是二维指针,如果我们使用一维或不使用指针,可以向我解释这个问题吗?提前感谢。

    struct old_method_list如下:

     struct old_method_list {
     void *obsolete;         
     int method_count;     
     /* variable length structure */
     struct old_method method_list[1];   //The address of the first Method   
     };
    

    好的,我读了另一篇关于为什么old_method_list使用二维指针的文章,原因是,它可能指向一个数组。我的另一个问题是,对于struct old_method method_list[1],评论是&#34;第一个方法的地址&#34;,但method_list是一个old_method数组,长度为1.如何存储地址?

  3. 我通过阅读另一篇文章解决了这个问题。 数组struct old_method method_list [1]是动态的,可以通过向其添加元素(方法)来更改它。

1 个答案:

答案 0 :(得分:0)

因为它指向old_method_list处的指针数组。

old_method_list的更新。

old_method_list *不仅可以指向old_method_list。它也可以指出例如:

struct old_method_list_with_10_methods
{
 struct old_method_list list;
 struct old_method method_list[9];
};

或者如果您需要动态尺寸:

old_method_list* list = malloc(sizeof(old_method_list) + (n-1) * sizeof(old_method));
list->method_count = n;

这是一种可变长度的结构。