- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的理解是,Objective-C 中的对象 和类 只是结构。
分别是:
struct objc_class *
和:
struct objc_object *
问题 #1:
objc_msgSend(id self, SEL _cmd);
id
据我所知是 struct objc_object *
但是当我们调用一个类的方法,一个类型为struct objc_class *
的类,
我希望它会引起问题或发出某种警告,例如“嘿,我的 friend ,这里输入错误”。
但是没有。
这只是为了满足我的好奇心,因为即使没有完全理解这一点,它似乎也没有给我带来任何麻烦(到目前为止)。但我想深入挖掘并学习基础知识/“特性”。
问题 #2:
由于根据我的经验没有警告(与问题 #1 相关),因此我不确定他们可能 可互换使用。
struct objc_class *
和 struct objc_object *
真的可以互换使用吗?
如果是:
您能否向我展示一个场景和示例,我们何时/如何/为什么需要互换使用它们?
什么是好处(如果有)、缺点(如果有)和“陷阱”(需要注意的事情出于;如果有的话)这样做?
最佳答案
My understanding is that objects and classes in Objective-C are just structs.
这不是真的,特别是自 ObjC2 以来,绝对不是一个好的思考方式。所讨论的“结构”定义了一个字段 (isa
)。而已。它只是名义上的“结构”。
请注意,在 ARC 下,编译器对对象和结构的处理方式不同。对象指针将得到结构指针不会得到的特殊处理(包括 nil 初始化)。编译器还将 ->
应用到对象而不是结构。结构指针必须有一个字段,其名称在 ->
之后给出。 objc_object
只有一个字段(isa
)。由于可以在运行时定义和重新定义类层次结构,因此编译器无法像对结构那样在编译时对对象求值 ->
。
我提出这一点是因为在 C++ 中,对象和结构只是同一事物的略微不同版本,您可以轻松地在它们之间进行交换。你不能在 ObjC 中安全地这样做。它们几乎没有那么相似。
But when we call a class method, a class, which is of type
struct objc_class *
, I would expect it to cause problem…
This is because classes are objects.对象不是根据 objc_object
类型定义的。它们是根据具有 isa
字段(它曾经是一个指针,但现在它可能是一个指针,or it might not)来定义的。这是假设 typedef 是重要的问题的一部分。它不是。重要的是它的行为是否像一个对象。 Objective-C 是一种主要是鸭子类型的语言。如果它的行为像一个对象,那么它就是一个对象。
顺便说一句,NSProxy
也生活在这个奇怪的几乎是一个对象的世界中。如果你注意到它的定义,它不会继承任何东西,但它确实声明了一个 isa
字段作为它的第一个 ivar。这是让它表现得像一个对象的关键部分。
Can struct objc_class * and struct objc_object * really be used interchangeably?
没有。您通常可以将类传递给任何需要对象的对象(因为类是对象),但不能将对象传递给需要类的对象。
关于iOS/Objective-C - struct objc_class * 和 struct objc_object *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874458/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!