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