[self class]在Objective-C中特别吗

[self class]在Objective-C中特别吗,objective-c,Objective C,今天我遇到了一些代码,这些代码执行以下操作: - (instancetype)initWithBlah:(Blah)blah { NSLog(@"Initialising instance of %@", [self class]); if ((self = [super init]) != nil) { // blargh } return self; } 现在,这看起来很奇怪,因为self在几行之后实际设置之前就已经在[self class]中使用了,但在这里似乎

今天我遇到了一些代码,这些代码执行以下操作:

- (instancetype)initWithBlah:(Blah)blah {
  NSLog(@"Initialising instance of %@", [self class]);

  if ((self = [super init]) != nil) {
    // blargh
  }
  return self;
}
现在,这看起来很奇怪,因为self在几行之后实际设置之前就已经在
[self class]
中使用了,但在这里似乎从未崩溃,编译器也没有发出嘎嘎声,而且它确实可以工作


objc编译器是否专门处理了
[self class]
,只是静态地对类对象求值?

否。没有什么特别的

self
实际上是在方法主体的条目上设置的。但是
[super init
可能会返回一个不同的实例,因此会重新分配。因此,从技术上讲,log语句可能会记录一些在初始值设定项末尾不再为真的内容

您可能想阅读以下内容:


不,没有什么特别的

self
实际上是在方法体的条目上设置的。但是
[super init
可能会返回一个不同的实例,因此会重新分配。因此,从技术上讲,log语句可能会记录一些在初始值设定项结束时不再为真的内容

您可能想阅读以下内容:


[self class]
未经编译器特殊处理。这是一种正常的消息发送

在苹果平台上用Objective-C构建对象如下:

UIView *view = [[UIView alloc] init];
有两个步骤:
alloc
init

首先,通过向类对象发送
alloc
消息来分配对象的堆存储。几乎所有类对象都只是继承
NSObject
alloc
方法。此方法使用
malloc
(或类似方法)分配堆存储,用零填充存储器,并将对象的
isa
实例变量设置为指向自身(接收
alloc
方法的类对象)

第二,通过向新创建的对象发送一条
init
消息,要求该对象对自身进行初始化。与
alloc
不同,
init
通常被重写,或者类提供特定于类的初始化消息(如
initWithBlah:

当对象接收到
init
类型的消息时,其
isa
实例变量已设置为指向其类对象,其所有其他实例变量已设置为零

当普通对象收到
消息时,它只返回其
isa
引用的类

我在这里进行了简化,因为现代Objective-C运行时支持一种称为的东西,其中除了类指针之外,其他东西都编码在
isa
字段中,因此
class
方法必须做更多的工作才能从字段中获取类指针。但是
isa
字段仍然由初始化e> alloc


在对象引用中直接嵌入对象的类的位置也有一种称为。对于这些对象,
class
的工作方式不同,但只有少数系统类使用标记指针,因此标记指针永远不会影响
class
为您自己的用户定义类工作的方式。

[self class]
不受编译器的特殊处理。这是一种正常的消息发送

在苹果平台上用Objective-C构建对象如下:

UIView *view = [[UIView alloc] init];
有两个步骤:
alloc
init

首先,通过向类对象发送
alloc
消息来分配对象的堆存储。几乎所有类对象都只继承
alloc
方法
NSObject
。此方法使用
malloc
(或类似的方法)分配堆存储,用零填充存储器,并将对象的
isa
实例变量设置为指向自身(接收
alloc
方法的类对象)

第二,通过向新创建的对象发送一条
init
消息,要求该对象对自身进行初始化。与
alloc
不同,
init
通常被重写,或者类提供特定于类的初始化消息(如
initWithBlah:

当对象接收到
init
类型的消息时,其
isa
实例变量已设置为指向其类对象,其所有其他实例变量已设置为零

当普通对象收到
消息时,它只返回其
isa
引用的类

我在这里进行了简化,因为现代Objective-C运行时支持一种称为的东西,其中除了类指针之外,其他东西都编码在
isa
字段中,因此
class
方法必须做更多的工作才能从字段中获取类指针。但是
isa
字段仍然由初始化e> alloc

在对象引用中直接嵌入对象的类的位置也有一种称为。对于这些对象,
class
的工作方式不同,但只有少数系统类使用标记指针,因此标记指针永远不会影响
class
为您自己的用户定义类工作的方式