是`super`局部变量?

时间:2010-06-03 01:08:11

标签: objective-c

// A : Parent
@implementation A
-(id) init
{
    // change self here then return it
}
@end A

A *a = [[A alloc] init];

一个。只是想知道,如果自我是局部变量还是全局?如果它是本地的那么self = [super init]init的重点是什么?我可以成功定义一些局部变量并像这样使用,为什么我需要将它分配给self

-(id) init
{
    id tmp = [super init];
    if(tmp != nil) {
        //do stuff
    }
    return tmp;
}

湾如果[super init]返回一些其他对象实例而我必须覆盖self,那么我将无法再访问A的方法,因为它将是全新的对象?我是对的吗?

℃。 superself指向相同的内存,它们之间的主要区别在于方法查找顺序。我是对的吗?

抱歉,没有Mac试试,现在学习理论......

2 个答案:

答案 0 :(得分:5)

Dreamlax的回答是正确的......但是,澄清可能会有所帮助。

  

一个。只是想知道,如果自己是一个本地人   变量还是全局?如果它是当地的话   什么是自我的意义= [超级   init中的init?我能成功   定义一些局部变量并使用   像这样,为什么我需要分配   它是自我。

self不是局部变量。它是方法调用的参数。事实上,第一个论点。第二个参数是_cmd,即正在执行的方法的选择器的名称。

self的特殊之处在于编译器使用self来访问实例变量。也就是说,如果你说self = [super init]并且超类的init恰好返回不同的东西,那么任何进一步的实例变量访问仍然是正确的。

  

湾如果[super init]返回其他一些   对象实例,我必须   覆盖自我然后我将无法   从那以后再访问A的方法了   这将是一个全新的对象?我   正确?

如果super init返回与A不兼容的实例,那么在超类的设计中出现了一些可怕的错误。请记住,Objective-C是完全动态的。因此,没有理由认为超级init返回的任何内容实际上需要是A的一个实例,但最好还是像A那样做得很好。现在,它可能是A的子类的全新实例,因此,A的所有方法都可以正常工作。

在线之间阅读;请记住,Objective-C是完全动态的。没有静态方法调度这样的东西。对象的类可以随时更改,只要新类响应该方法,任何随机方法调用仍然可以工作。并不是说这实际上是在运行时发生的,只是可以

  

℃。超级和自我指向相同   记忆和主要区别   它们之间是方法查找顺序。   我是对的吗?

现在,这是一个有趣的问题。 super并没有真正指向任何事物。出于所有意图和目的,super可以被视为此中的一点魔力。也就是说,当编译器将super视为方法调用的目标时,它会将其编译为稍微不同的调用站点,该调用站点调用objc_msgSendSuper()的一个变体,顾名思义 - - 有效地“搜索”方法的实现,从编译调用的类的父类开始

答案 1 :(得分:2)

  1. Self是提供给方法实现的参数。所有Objective-C实例和类方法都在方法的参数之前有两个隐式参数。隐式参数是self_cmd_cmd是用于确定方法实现的选择器。

  2. 如果super返回不同类的实例,那就是这种情况,但它也可能返回同一类的不同实例。

  3. super是关键字,而不是变量。它通知编译器使用不同的运行时函数,该函数在高于当前类的一个类开始方法解析。