我想知道我们何时应该在目标c中使用二维指针。我读了一篇关于运行时机制的文章。方法objc_msgSend的实现细节如下:
任何NSObject
目标都有isa
的属性,该属性将指向相应的Class
对象。
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
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.如何存储地址?
我通过阅读另一篇文章解决了这个问题。 数组struct old_method method_list [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;
这是一种可变长度的结构。