Objective-c中的含义是什么?

时间:2010-08-04 11:54:47

标签: objective-c

我想通过一个例子来了解下面写的行的含义。我无法理解线条的实际含义。这些行来自google的objective-c编码指南。

  

初始化
  不要在init方法中将变量初始化为0或nil;这是多余的。

     

新分配对象的所有内存初始化为0(isa除外),因此不要通过将变量重新初始化为0或nil来使init方法混乱。

2 个答案:

答案 0 :(得分:90)

在幕后,Objective-C对象基本上是C结构。每个字段都包含一个名为isa的字段,该字段是指向该对象所属的类的指针(这就是对象和Objective-C运行时如何知道它是什么类型的对象)。

关于变量的初始化:在Objective-C中,实例变量自动初始化为0(对于C类型,如int)或nil(对于Objective-C对象)。 Apple的指南说,将{iv}初始化为init方法中的值是多余的,所以不要这样做。例如,假设你有一个这样的类:

@interface MyClass : NSObject
{
    int myInt;
    double myDouble;
    MyOtherClass *myObj;
}
@end

以这种方式编写init方法将是多余的,因为无论如何,这些ivars将初始化为0nil

@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初始化为0nil以外的值,您仍应初始化它们:

@implementation MyClass

- (id)init
{
    if ((self = [super init])) {
        myInit = 10;
        myDouble = 100.0;
        myObj = [[MyOtherClass alloc] init];
    }
    return self;
}

@end

答案 1 :(得分:30)

当Objective-C运行时分配对象时,实例变量所在的所有内存都将为您清零,因此无需将实例变量设置为0或nil。您可以将它们设置为您想要的任何值。一些开发人员甚至忽略冗余并将实例变量设置为0,只是为了显式或描述目的。

isa表示“是一个”。每个Objective-C对象(包括每个类)都有一个isa指针。运行时遵循此指针来确定对象是什么类,因此它知道对象响应的选择器,超类是什么,对象具有什么属性等等。