在Objective-C中,isa是什么意思?
我想通过一个例子来知道下面的书面文字的含义。 我无法理解这些线的实际含义。 这些代码来自google的objective-c编码准则。
初始化
在init方法中,不要将variables初始化为0或nil; 这是多余的。新分配的对象的所有内存初始化为0(isa除外),所以不要通过将variables重新初始化为0或nil来干扰init方法。
Objective-C对象基本上是C结构。 每一个都包含一个名为isa
的字段,它是指向对象是实例的类的指针(这就是对象和Objective-C运行时如何知道它是什么types的对象)。
关于variables的初始化:在Objective-C中,实例variables被自动初始化为0
(对于Ctypes如int
)或nil
(对于Objective-C对象)。 苹果的指导方针说,初始化你的ivars在你的init
方法中的值是多余的,所以不要这样做。 例如,假设你有这样的课程:
@interface MyClass : NSObject { int myInt; double myDouble; MyOtherClass *myObj; } @end
以这种方式编写init
方法将是多余的,因为这些ivars将被初始化为0
或nil
:
@implementation MyClass - (id)init { if ((self = [super init])) { myInt = 0; myDouble = 0.0; myObj = nil; } return self; } @end
你可以这样做:
@implementation MyClass - (id)init { return [super init]; } @end
当然,如果你想将ivars初始化为0
或者nil
以外的值,你仍然应该初始化它们:
@implementation MyClass - (id)init { if ((self = [super init])) { myInit = 10; myDouble = 100.0; myObj = [[MyOtherClass alloc] init]; } return self; } @end
当Objective-C运行时分配对象时,实例variables所在的所有内存都将为您清零,因此不需要将实例variables设置为0或nil
。 您可以将它们设置为您想要的任何值。 有些开发人员甚至忽略冗余,并将实例variables设置为0,只是为了明确或描述的目的。
isa
意思是“是一个”。 每个Objective-C对象(包括每个类)都有一个isa
指针。 运行时间遵循这个指针来确定一个对象是什么类,所以它知道对象响应的select器,它的超类是什么,对象有什么属性,等等。