Obj-C在同一个类中使用静态方法的静态方法使用@selector?

时间:2011-02-20 01:47:36

标签: objective-c static callback selector static-methods

我在同一个类中有两个静态方法/选择器,一个作为回调传递给外部方法。但是,我如何编码我得到一个错误。当两个方法都是实例方法时,这都有效,并且我已经读过,当第一个方法是使用[self class]的实例方法时,它可以工作。但是,当两者都是静态的时,我都没有找到信息,而且我还没有找到它。

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

谢谢!

2 个答案:

答案 0 :(得分:4)

Callback * managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse :)] autorelease];

该行代码设置为调用实例方法Parse:,而不是您定义的类方法。

Objective-C没有静态方法。它有类方法和实例方法。

同样,你的方法应该以小写字母开头。

HERP-DA-DERP。戴夫是对的。

鉴于此:

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

一些意见:

  • 方法应以小写字母开头

  • 在这样的角色中使用课程是非常奇怪的;即使你真的只需要其中一个,也可以使用实例。至少,实例是一个方便的存储桶,如果你需要两个,它将在未来更容易进行重构。

  • 上述模式假设(并且我ASSumed)保留Callback的实例。对于回调,定时器和其他一些模式,这是典型的;保留目标,直到最后一次调用目标。然后释放(或自动释放)。但是,通知中心不会这样做。通常也不会保留代表。

答案 1 :(得分:1)

事实证明代码写得正确以执行我想要的操作,但由于回调设置为autorelease,因此在回调处理之前对象已被释放。