gpt4 book ai didi

objective-c - 是类结构还是结构指针

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:59 25 4
gpt4 key购买 nike

如果我没记错的话,结构是指对象,而结构指针是指指向对象的指针,对吗?在一篇文章中,它说类是结构,这意味着它们是对象。

Filter the list of all classes
The traditional definition of a class in Objective-C looks like this:

struct objc_class {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};

所以,如果它说类是结构,那么它们将如何适应 objc_msgSend(id self, SEL_cmd) 的参数,它需要一个 id< 类型的结构指针?

最佳答案

类是结构,但是 Class是指针类型,定义为

typedef struct objc_class *Class;

这回答了问题的第一部分。

现在,如果您看一下 <objc/objc.h>你会发现

struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

并在<obj/runtime.h>你会发现

/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};

意味着在 Objective-C 2.0 中 objc_objectobjc_class是相同的结构,都有一个 isa字段。

这就是为什么你可以传递 Class哪里有id必填项:classes are objects after all .

您通常会收到有关不兼容指针类型的警告,但显然 Obj-C 编译器对这种特定情况使用了特殊处理。不过,我没有任何引用资料支持这一点。

编辑

终于在clang源码中找到了引用:

ASTContext.cpp , 这是 Class声明

TypedefDecl *ASTContext::getObjCClassDecl() const {
if (!ObjCClassDecl) {
QualType T = getObjCObjectType(ObjCBuiltinClassTy, 0, 0);
T = getObjCObjectPointerType(T);
TypeSourceInfo *ClassInfo = getTrivialTypeSourceInfo(T);
ObjCClassDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
getTranslationUnitDecl(),
SourceLocation(), SourceLocation(),
&Idents.get("Class"), ClassInfo);
}

return ObjCClassDecl;
}

这是id声明

TypedefDecl *ASTContext::getObjCIdDecl() const {
if (!ObjCIdDecl) {
QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0);
T = getObjCObjectPointerType(T);
TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T);
ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this),
getTranslationUnitDecl(),
SourceLocation(), SourceLocation(),
&Idents.get("id"), IdInfo);
}

return ObjCIdDecl;
}

在这两种情况下,类型都设置为 getObjCObjectPointerType 的结果.这导致编译器同时考虑 Classid作为指向 Objective-C 对象的指针。

关于objective-c - 是类结构还是结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com